为什么C ++编译需要这么长时间?

北城余情 提交于 2020-02-27 04:12:29

与C#和Java相比,编译C ++文件需要很长时间。 编译C ++文件所需的时间比运行普通大小的Python脚本要长得多。 我目前正在使用VC ++,但它与任何编译器都是一样的。 为什么是这样?

我能想到的两个原因是加载头文件和运行预处理器,但这似乎不应该解释为什么它需要这么长时间。


#1楼

大多数答案都有点不清楚,提到C#总是运行较慢,因为在编译时只执行一次C ++执行的操作,这种性能成本也会受到运行时依赖性的影响(需要加载更多的东西才能运行)运行),更不用说C#程序将始终具有更高的内存占用,所有这些都导致性能与可用硬件的能力更密切相关。 对于解释或依赖于VM的其他语言也是如此。


#2楼

在较大的C ++项目中减少编译时间的一种简单方法是制作一个* .cpp包含文件,其中包含项目中的所有cpp文件并进行编译。 这会将标题爆炸问题减少一次。 这样做的好处是编译错误仍将引用正确的文件。

例如,假设你有a.cpp,b.cpp和c.cpp ..创建一个文件:everything.cpp:

#include "a.cpp"
#include "b.cpp"
#include "c.cpp"

然后通过make everything.cpp编译项目


#3楼

构建C / C ++:真正发生了什么,为什么需要这么长时间

软件开发时间的相当大一部分不用于编写,运行,调试甚至设计代码,而是等待它完成编译。 为了使事情变得快速,我们首先要了解编译C / C ++软件时发生的事情。 步骤大致如下:

  • 组态
  • 构建工具启动
  • 依赖性检查
  • 汇编
  • 链接

现在,我们将更详细地研究每个步骤,重点关注如何更快地制作它们。

组态

这是开始构建的第一步。 通常意味着运行配置脚本或CMake,Gyp,SCons或其他一些工具。 对于非常大的基于Autotools的配置脚本,这可能需要一秒到几分钟的时间。

这个步骤相对很少发生。 只需在更改配置或更改构建配置时运行它。 如果没有更改构建系统,那么要做得更快,就没有太多工作要做。

构建工具启动

当您运行make或单击IDE上的构建图标(通常是make的别名)时会发生这种情况。 构建工具二进制文件启动并读取其配置文件以及构建配置,这通常是相同的。

根据构建的复杂性和大小,这可能需要从几分之一秒到几秒钟。 这本身就不会那么糟糕。 不幸的是,大多数基于make的构建系统会导致make为每个构建调用数十到数百次。 通常这是由递归使用make引起的(这很糟糕)。

应该注意的是,Make的原因是如此缓慢并不是一个实现错误。 Makefile的语法有一些怪癖,它们实现了一个非常快速的实现,但几乎不可能。 与下一步结合使用时,此问题更加明显。

依赖性检查

一旦构建工具读取了其配置,就必须确定哪些文件已更改以及哪些文件需要重新编译。 配置文件包含描述构建依赖关系的有向非循环图。 此图通常在配置步骤中构建。 构建工具启动时间和依赖扫描程序在每个构建上运行。 它们的组合运行时确定了编辑 - 编译 - 调试周期的下限。 对于小型项目,这个时间通常是几秒钟左右。 这是可以忍受的。 Make还有其他选择。 其中最快的是Ninja,它是由Google工程师为Chromium构建的。 如果您使用CMake或Gyp构建,只需切换到他们的Ninja后端。 您无需在构建文件中自行更改任何内容,只需享受速度提升即可。 但是,Ninja并没有打包在大多数发行版上,因此您可能必须自己安装它。

汇编

此时我们终于调用了编译器。 切割一些角落,这是采取的近似步骤。

  • 合并包括
  • 解析代码
  • 代码生成/优化

与流行的看法相反,编译C ++实际上并不是那么慢。 STL很慢,用于编译C ++的大多数构建工具都很慢。 但是,有更快的工具和方法来缓解语言的缓慢部分。

使用它们需要一点肘部油脂,但好处是不可否认的。 更快的构建时间可以带来更快乐的开发人员,更高的灵活性以及最终更好的代码。


#4楼

一些原因是:

1)C ++语法比C#或Java更复杂,需要更多时间来解析。

2)(更重要)C ++编译器生成机器代码并在编译期间执行所有优化。 C#和Java只走了一半,将这些步骤留给了JIT。


#5楼

C ++被编译成机器代码。 所以你有预处理器,编译器,优化器,最后是汇编器,所有这些都必须运行。

Java和C#编译成字节码/ IL,Java虚拟机/ .NET Framework在执行之前执行(或JIT编译成机器代码)。

Python是一种解释语言,也可以编译成字节码。

我确信还有其他原因,但一般来说,不必编译为本机机器语言可以节省时间。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!