我在每次提交时在buildbot中编译2个C++项目.两者都是大约1000个文件,一个是100 kloc,另一个是170 kloc.编译时间与gcc(4.4)到Visual C++(2008)有很大不同.
一个项目的Visual C++编译需要20分钟.他们无法利用多核,因为项目依赖于另一个.最后,在Debug和Release中对32和64位的两个项目进行完整的编译需要超过2 1/2小时.
一个项目的gcc汇编需要4分钟.它可以在4个核心上并行化,大约需要1分10秒.2个项目的4个版本(Debug/Release,32/64位)的所有8个版本都在不到10分钟的时间内编译完成.
Visual C++编译时发生了什么?它们基本上慢了5倍.
编译C++ kloc的平均时间是多少?我的是带有vc ++的7 s/kloc和带有gcc的1.4 s/kloc.
可以做任何事情来加快Visual C++上的编译时间吗?
我想问一下Clojure上有哪种类型的安全语言?
我现在已经多次读过Luke VanderHart和Stuart Sierra的'Practical Clojure',但我仍然有一个明显的印象,即Clojure(和其他lisps一样)不会非常认真地对编译时验证进行检查.类型安全只是一种(非常流行的)策略,用于对正确的语义进行编译时检查
我问这个问题,因为我很难被证明是错的; 什么样的设计模式可用于clojure(在编译时,而不是在运行时)验证期望字符串的函数不会被调用,例如,整数列表?
此外,我读过非常聪明的人,比如Paul Graham公开提倡lisp允许在它之上实现低级语言的所有内容(大多数人会说语言本身正在重新实现),所以如果那个断言这将是真的,然后像类型检查这样简单的东西应该是小菜一碟.所以你觉得在clojure或其他lisps中存在类型系统(或实现这种类型系统的能力),这使得程序员能够将验证检查从运行时间偏移到编译时,甚至更好,设计 - 时间?
static-analysis compiler-errors clojure type-safety compilation-time
我真的很想知道,为什么即使最近的Tex/Latex系统也没有使用任何缓存来加速以后的运行.每次我修复一个逗号*时,调用Latex花费我大约相同的时间,因为它需要加载和转换每个图片文件.
(*我知道即使更改一个微小的逗号也会影响整个结构,但当然,一个编写良好的缓存格式可以看到它的影响.另外,可能会出现这样的情况:只要速度快,就不需要100%的正确性.)
Tex 的语言中是否存在使得复杂或不可能完成的事情,或者只是在Tex的原始实现中,没有必要这样做(因为在那些大型计算机上它本来会很慢)?
但另一方面,为什么这不会让其他人如此烦恼以至于他们已经启动了一个具有某种缓存的分支(或者将Tex文件透明地转换为更快解析的格式)?
有什么办法可以加快Latex的后续运行吗?除了将所有内容放入chapterXX.tex文件然后将它们评论出来之外?
我在Visual Studio 2012解决方案中有几个C++项目.这些项目包含大量文件,我使用/ MP来加速代码生成.
我想知道是否有办法以类似的方式加速NVCC.在包含CUDA内核的项目中使用/ MP在编译时没有任何好处,我只能看到一个核心在工作.
所以问题是:如何使用我的多核PC来加速CUDA编译?
有没有选项,除了-O0
可以加快编译时间?
如果生成的程序不会被优化,那也没关系.实际上我想经常快速地检查大型haskell包.
Flag -fno-code
大大加快了编译速度,但由于此程序使用了TemplateHaskell,因此无法使用它.
我试图获取从Eclipse导出的可运行JAR文件的编译时间.一种方法可能是获取META-INF/MANIFEST.MF文件的修改时间.不幸的是,我似乎无法找到一种方式来获得这些信息(我知道如何使用阅读清单本身getResourceAsStream("/META-INF/MANIFEST.MF")
,但我似乎无法能够读取其修改时间).
有没有人知道如何做到这一点?
我正在尝试分析项目的构建时间,以便了解什么花费了最多的时间。这看起来应该很容易......如果我有一切clang
在文件中列出了每个命令,我可以对每个命令进行计时并按时间排序以找到花费最长的编译,然后我可以进去看看哪些编译单位感到惊讶并试图找出为什么他们这么慢。
谷歌搜索对此一无所获。显然这是可能的并且很有用。
所以,要么:
或者
clang
它想要运行的所有命令的列表?CXX_COMPILER_LAUNCHER
?在Delphi XE2中,自动生成的构建号功能现在使用某种日期和时间生成的值,如下所示:
2.4.4386.838
每次构建时最后两个数字都会更改,并且基于当前日期和时间:
Major = 2 (user defined)
Minor = 4 (user defined)
Release = 4386 (number of days since Jan 1 2000)
Build = 838 (number of seconds since 00:00:00)
Run Code Online (Sandbox Code Playgroud)
我想这个发布和构建数字的新格式是从.NET实现中借用的,它实现了非常相似的功能.在.net中,最后一个数字(Build)等于自当地时间午夜以来的秒数除以2.有关.net实现的详细信息,请参阅此链接:艰难地确定构建日期
如果可以依靠这种方式保持这种方式,那么现在我们有更好的方法来确定编译时间而不是
使用IDE插件
使用PE Headers hacks
问题不在于如何返回旧的自动增量版本号功能.
问题是 XE2是否确实使用了上面显示的日期和时间,从2010年1月1日开始,在Build和Release数字中添加了几天和几秒?
将源文件用于基于模板的类(STL和boost)以及将实现放入标头似乎是一种常见的惯例.我假设与头文件和源文件中的声明和实现之间的经典分离相比,这将增加编译包含头文件的源文件所需的时间.这样做的原因可能是因为您必须告诉源文件中的编译器使用哪些模板,这可能会导致文件膨胀.a文件.
假设链接器在库增长时也需要更多时间,那么编译包含库头的源文件所需的时间会更快?
1.不使用.cpp文件并将整个类(包括实现)放入标头中
//foo.hpp
template <class T>
class Foo
{
public:
Foo(){};
T bar()
{
T* t = NULL;
//do stuff
return *t;
}
};
Run Code Online (Sandbox Code Playgroud)
要么
2.在库本身的源文件中显式编译各种类型的模板
//foo.h
template <class T>
class Foo
{
public:
Foo(){};
T bar();
};
//foo.cpp
template <class T>
T Foo<T>::bar()
{
T* t = NULL;
//do stuff
return *t;
}
template class Foo<int>;
template class Foo<float>;
template class Foo<double>;
template class Foo<long long>;
Run Code Online (Sandbox Code Playgroud) c++ templates header compilation-time explicit-instantiation
compilation-time ×10
c++ ×4
c# ×1
clojure ×1
cmake ×1
comparison ×1
compilation ×1
cuda ×1
delphi ×1
delphi-xe2 ×1
gcc ×1
ghc ×1
haskell ×1
header ×1
jar ×1
java ×1
latex ×1
manifest.mf ×1
parsing ×1
pdflatex ×1
profiling ×1
templates ×1
tex ×1
type-safety ×1
visual-c++ ×1
xamarin ×1
xamarin.ios ×1