与C#和Java相比,编译C++文件需要很长时间.编译C++文件所需的时间比运行普通大小的Python脚本要长得多.我目前正在使用VC++,但它与任何编译器都是一样的.为什么是这样?
我能想到的两个原因是加载头文件和运行预处理器,但这似乎不应该解释为什么它需要这么长时间.
这个问题可能有些奇怪,但我怎样才能加快g ++编译时间?我的C++代码大量使用boost和模板.我已经尽可能多地从头文件中移动并使用-j选项,但是编译(和链接)仍需要很长时间.
是否有任何工具可以分析我的代码并指出编译器的瓶颈?或者可以以某种方式分析在我的代码上运行的编译器?这将是非常好的,因为有时我有这样的印象,我花了太多时间盯着编译器控制台日志...
Stack Overflow上的一个问题的答案(见下文)给了我一个很棒的小软件的想法,这对于所有编码器来说都是非常宝贵的.
我正在想象RAM驱动器软件,但有一个关键的区别 - 它将镜像我硬盘上的真实文件夹.更具体地说 - 包含我正在处理的项目的文件夹.这样,任何构建几乎都是瞬时的(或者至少快几个数量级).RAM驱动器将仅使用空闲资源将其内容与后台硬盘驱动器同步.
一个快速的谷歌搜索没有透露,但也许我只是不知道如何谷歌.也许有人知道这样的软件?最好免费,但合理的费用也可以.
补充:已经提出了一些我在一开始就丢弃的解决方案.他们将(没有特别的顺序):
补充2:出现了一个想法 - 使用普通的RAM驱动器加上后台文件夹同步器(但我的意思是背景).有这样的事吗?
补充3:有趣.我刚刚尝试了一个简单的RAM驱动器.重建时间从大约14秒下降到大约7秒(不差),但增量构建仍然在~5秒 - 就像在HDD上一样.有什么想法吗?它使用aspnet_compiler和aspnet_merge.也许他们在其他地方做其他临时文件?
补充4:哦,很好的新答案!:)好的,我为你所有的反对者提供了更多的信息.:)
这个想法的主要原因之一不是上述软件(14秒构建时间),而是另一个我当时无法访问的软件.这个其他应用程序有100 MB的代码库,其完整版本大约需要5分钟.啊,是的,它在Delphi 5中,所以编译器不太先进.:)将源放在RAM驱动器上导致了巨大的差异.我想,我得到它的时间不到一分钟.我没有测量过.因此对于所有那些说操作系统可以更好地缓存内容的人 - 我会乞求不同.
相关问题:
关于第一个链接的注意事项: 它链接的问题已被删除,因为它是重复的.它问道:
你的代码编译时你做了什么?
我联系的Dmitri Nesteruk的答案是:
我几乎立即编译.部分原因是我的项目很小,部分原因是因为使用了RAM磁盘.
你如何减少VC++项目(原生C++)的编译时间和链接时间?
请指定每个建议是否适用于调试,发布或两者.
cmake --build . --config Release
Run Code Online (Sandbox Code Playgroud)
是否可以设置可以参与构建过程的核心数量?
与GNU make类似的东西-j.
我有一个小的C程序来计算哈希值(哈希表).我希望代码看起来很干净,但有一些与它无关的东西让我烦恼.
我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr/bin/time为基准).但是,当我在forf循环中使用printf()时,程序会减慢到大约5秒钟.
我期待着有趣而详细的回复.谢谢.
PS:这是一个编译器构造工具集,所以不要害羞进入细节.虽然这与问题本身无关,但我只想指出细节让我感兴趣.
附录
我正在寻找更多解决方案和解释的程序方法.确实,管道工作起了作用,但我无法控制"用户"的作用.
当然,我现在正在进行测试,"普通用户"不会这样做.但这并没有改变一个简单的printf()减慢一个进程的事实,这是我试图找到一个最佳的编程解决方案的问题.
附录 - 惊人的结果
参考时间用于TTY内的普通printf()调用,大约需要4分钟20秒.
在/ dev/pts(例如Konsole)下进行测试可将输出速度提高到约5秒.
在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒.
setbuffer()在使用时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒).
令人惊讶的是,如果我在TTY1上开始测试然后切换到另一个TTY,它确实需要与PTS相同:大约5秒.
结论:内核做了一些与可访问性和用户友好性有关的事情.呵呵!
通常情况下,无论你是在活动时盯着TTY还是切换到另一个TTY,它都应该同样慢.
课程:运行输出密集型程序时,切换到另一个TTY!
我曾经做过一个C++项目,花了大约一个半小时进行完全重建.小编辑,构建,测试周期大约需要5到10分钟.这是一场没有生产力的噩梦.
您需要处理的最差构建时间是多少?
您使用了哪些策略来改善大型项目的构建时间?
更新:
您认为使用的语言对这个问题有多大责任?我认为C++很容易对大型项目产生大量依赖,这通常意味着即使对源代码进行简单的更改也可能导致大规模的重建.您认为哪种语言最能应对大型项目依赖问题?
是否有一种自动方式来优化C++中头文件的包含,从而提高编译时间?"自动"一词是指工具或程序.是否有可能找到哪些头文件已过时(例如,未使用暴露的功能)?
编辑:让每个包含标题"只包含一次是一件重要的事情,但有没有办法甚至更改文件的内容,以便经常使用的"功能"在特定包含和不常用的功能是在其他包括?我要求太多?不幸的是,我们正在谈论一个包含数千个文件的现有代码库.它可能是我实际要求的重构工具吗?
谢谢.
有许多超薄笔记本电脑,价格便宜,使用方便.编程具有在任何存在沉默和舒适的地方完成的优点,因为长时间集中是能够进行有效工作的重要因素.
我有点老式,因为我喜欢我的静态编译的C或C++,这些语言可以很长时间在那些功耗受限的笔记本电脑上编译,特别是C++ 11和C++ 14.
我喜欢做3D编程,我使用的库可能很大而且不会宽容:子弹物理,Ogre3D,SFML,更不用说现代IDE的功耗了.
有几种解决方案可以使构建更快:
解决方案A:不要使用那些大型库,并提出更轻松的东西来减轻编译器的负担.编写适当的makefile,不要使用IDE.
解决方案B:在其他地方设置构建服务器,在肌肉发达的机器上设置makefile,并自动下载生成的exe.我不认为这是一个随意的解决方案,因为你必须瞄准你的笔记本电脑的CPU.
解决方案C:使用非官方的C++模块
???
还有其他建议吗?
我最近遇到了几个关于改善CMake启用C++项目周转时间的具体方面的问题(比如"我应该在什么级别分配我的构建过程?"或"cmake rebuild_cache 只是一个子目录?"),我是想知道是否有更一般的指导利用CMake提供的特定可能性.如果可能没有跨平台编译时优化,我主要对Visual Studio或基于GNU toochain的方法感兴趣.
我已经意识到并投资了一般推荐的领域来加速C++构建:
更改/优化/微调工具链
优化您的代码库/软件架构(例如,通过减少依赖关系并使用明确定义的子项目 - 单元测试)
投资更好的硬件(SSD,CPU,内存)
喜欢在这里,这里或这里推荐.所以我在这个问题上的重点是第一点.
另外我知道在CMake的Wiki中可以找到的建议:
前者只处理基础(并行make),后者主要处理如何加速解析CMake文件.
为了使这更具体一点,如果我从这里使用MSYS/GNU的100个库获取我的CMake示例,我得到了以下time测量结果:
$ cmake --version
cmake version 3.5.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ time -p cmake -G "MSYS Makefiles" ..
-- The CXX compiler identification is GNU 4.8.1
...
-- Configuring done
-- Generating done
-- Build files have been written to: [...]
real 27.03
user …Run Code Online (Sandbox Code Playgroud) c++ ×6
compilation ×5
performance ×3
cmake ×2
c ×1
c++11 ×1
caching ×1
directory ×1
g++ ×1
glibc ×1
gnu-make ×1
linux-kernel ×1
makefile ×1
nmake ×1
ramdrive ×1
stdout ×1
templates ×1
visual-c++ ×1