可以使用哪些技术来加速C++编译时间?
这个问题出现在Stack Overflow问题C++编程风格的一些评论中,我很想知道它有什么想法.
我见过一个相关的问题,为什么C++编译需要这么长时间?,但这并没有提供很多解决方案.
我最近有理由使用常规的Debug和Release配置来处理一些Visual Studio C++项目,还有'Release All'和'Debug All',这是我以前从未见过的.
事实证明,项目的作者有一个ALL.cpp,其中#includes所有其他.cpp文件.*所有配置只构建一个ALL.cpp文件.它当然被排除在常规配置之外,并且常规配置不构建ALL.cpp
我只是想知道这是否是一种常见做法?它带来了什么好处?(我的第一反应是闻起来很糟糕.)
您可能会遇到哪些陷阱?我能想到的是,如果你的.cpps中有匿名命名空间,它们不再是那个cpp'私有',但现在也可以在其他cpps中看到了吗?
所有项目都构建了DLL,因此在匿名命名空间中存储数据不是一个好主意,对吧?但功能会好吗?
干杯.
我认为C/C++与C#/ Java性能问题很好,这意味着我已经阅读了足够的证据来证明VM语言不一定比"接近硅"语言慢.主要是因为JIT编译器可以进行静态编译语言无法进行的优化.
然而,我最近收到了一个人的简历,他声称基于Java的高频交易总是被C++击败,并且他一直处于这种情况.
快速浏览工作现场确实表明HFT申请人需要C++知识,看看Wilmott论坛会显示所有从业者都在谈论C++.
这种情况有什么特别的原因吗?我原以为现代金融业务有点复杂,首选具有类型安全性,托管内存和丰富库的VM语言.这种生产力更高.此外,JIT编译器越来越好.他们可以在程序运行时进行优化,因此您认为他们使用该运行时信息来击败非托管程序的性能.
也许这些人正在用C++编写关键位并从托管环境(P/Invoke等)调用它们?那可能吗?
最后,有没有人有这方面的核心问题的经验,这就是为什么在这个领域,非托管代码毫无疑问优先于托管?
据我所知,HFT人员需要尽快对传入的市场数据作出反应,但这不一定是硬实时要求.如果你的速度慢,你的情况会更糟,这是肯定的,但是你不需要保证每次响应都有一定的速度,你只需要一个快速的平均值.
编辑
是的,到目前为止有几个很好的答案,但相当普遍(很好的基础).让我指出一下HFT人会运行什么样的程序.
主要标准是反应能力.当订单进入市场时,您希望成为第一个能够对其做出反应的订单.如果你迟到了,其他人可能会在你之前接受它,但是每个公司的策略都略有不同,所以如果一次迭代有点慢,你可能会好.
该程序全天运行,几乎没有用户干预.无论处理每个新的市场数据的功能是每秒运行几十(甚至几百)次.
这些公司通常对硬件的价格没有限制.
编写类和方法的代码内文档通常在哪里?
您是否在标题(.hpp)文件或源(.cpp)文件中的相应类/方法之上编写了这样的doc-blocks?
对这类事情有一个广受尊重的公约吗?大多数C++项目是以一种方式而不是另一种方式来做的吗?
或者文档应该写在双方(即.hpp和.cpp文件中),可能只有一个简短的描述,一个是另一个更长的一个?
最重要的是,是否有任何实际的考虑因素使得以一种方式而不是另一种方式编写它更方便?(例如使用Doxygen等自动文档解析器和生成器......)
我正在构建大量自动生成的代码,包括一个特别大的文件(~15K行),在linux上使用mingw32交叉编译器.大多数文件非常快,但是这个大文件需要很长时间(约15分钟)才能编译.
我试过操纵各种优化标志,看看它们是否有任何效果,没有任何运气.我真正需要的是一些确定g ++正在做什么的方法.是否有任何(相对简单的)方法让g ++生成关于不同编译阶段的输出,以帮助我缩小挂起的范围?
遗憾的是,我没有能力重建这个交叉编译器,因此不可能将调试信息添加到编译器并单步调试.
文件中有什么:
该文件是用于生成特定父类的大量不同特定子类的工厂.然而,大多数包括没有什么特别的花哨.
根据Neil Butterworth的建议,-ftime-report的结果表明,"生命分析"阶段需要921秒,占据了15分钟的大部分时间.
看起来这发生在数据流分析期间.文件本身是一堆条件字符串比较,按类名提供字符串构造对象.
我们认为将此更改为指向函数指针的名称映射可能会改善一些事情,因此我们将尝试这样做.
实际上,生成一堆工厂函数(每个对象)并从对象的字符串名称创建映射到指向其工厂函数的指针将编译时间从原来的15分钟缩短到大约25秒,这将节省每个人的大量时间在他们的构建上.
再次感谢Neil Butterworth关于-ftime-report的提示.
我注意到在同一台机器上,C#的编译时间远远少于C++.为什么?
注1:我没有做过任何科学基准.
注意2:在有人说这与编程无关之前,我正在实现一个解析器,我发现我可以从get get中做些什么来提高编译速度.
注3:我有一个类似的问题为什么汇编需要这么长时间?.这个问题询问了从C/C++到C#的具体差异.很明显,简单的语言编译比复杂的语言更快,但C和C#都是复杂的语言.
我的内容:1)C/C++从预处理器和头文件中缓慢.2)很多标头会导致更多的数据被解析.特别是当每个文件都可以使用预处理器时可以更改代码3)C#推迟一些编译到程序启动4)IL指令很简单,机器不是
我想知道是什么让主编译器(sun的javac)编译速度如此之快?
..以及Microsoft的C#.NET编译器.
我将它们与C++编译器(例如G ++)进行比较,所以也许我的问题应该是,是什么让C++编译器变得如此缓慢:)
可能重复:
为什么C++编译需要这么长时间?
嗨,
我在谷歌搜索了C++和Java编译过程之间的差异,但返回了C++和Java语言特性及其差异.
我精通Java,但不熟悉C++.但我修复了C++中的一些错误.根据我的经验,我注意到与Java相比,C++总是花费更多时间来进行微小的更改.
关心巴拉
我相信C编译通常比C++更快,因为它缺乏后期绑定和运算符重载等功能.我很想知道C++的哪些特性往往会减慢编译过程的速度?
可能重复:
为什么C++编译需要这么长时间?
我正在处理两个大小相同(loc)的不同项目.使用Ant的Java构建过程以分钟为单位进行测量.使用CMAKE工具的C++构建处理以小时为单位进行测量.
Java的哪些特性允许它比同类C++程序更快地构建?