g++编译速度是否通常远慢于gcc?我的编译耗时是否正常?
问题
由于大学课程要求,我过去几个月一直在用纯C语言编程,编写的程序很小且对资源要求极低,用gcc编译几乎瞬间完成(目前最大的程序仅耗时40ms)。
最近我参加了一个本地竞赛,该竞赛通常使用C++,因此我开始练习。尽管编写的程序仍然极小(甚至不到0.5kB),但我发现用g++编译时总会先有大约0.2秒的延迟,之后才是我熟悉的gcc那样的瞬间编译。
我当前测试的代码如下:
//#include <bits/stdc++.h> // 我注释掉了这行,原以为问题是因为包含了太多头文件 #include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; // 我知道这不算好实践,但竞赛里大家都说这么写方便 int mex(vector<int> arr, vector<int> subarr) { int min = INT_MAX; for (auto i : arr) { // 如果i不在subarr中 if (find(subarr.begin(), subarr.end(), i) == subarr.end()) { if (i < min) { min = i; } } } return min; } int main () { vector<int> a = {0,1,2,3,4,5}; vector<int> suba = {0, 1,3,4}; cout << mex(a, suba) << endl; return 0; }
这段代码编译耗时240ms。以下是g++的ftime-report输出:
Time variable usr sys wall GGC phase setup : 0.00 ( 0%) 0.00 ( 0%) 0.00 ( 0%) 1562k ( 2%) phase parsing : 0.16 ( 84%) 0.13 ( 87%) 0.29 ( 85%) 60M ( 83%) phase lang. deferred : 0.01 ( 5%) 0.01 ( 7%) 0.02 ( 6%) 5818k ( 8%) phase opt and generate : 0.02 ( 11%) 0.01 ( 7%) 0.03 ( 9%) 5468k ( 7%) |name lookup : 0.05 ( 26%) 0.02 ( 13%) 0.03 ( 9%) 2550k ( 3%) |overload resolution : 0.01 ( 5%) 0.00 ( 0%) 0.02 ( 6%) 6891k ( 9%) callgraph construction : 0.01 ( 5%) 0.00 ( 0%) 0.01 ( 3%) 1448k ( 2%) df scan insns : 0.01 ( 5%) 0.00 ( 0%) 0.00 ( 0%) 4128 ( 0%) preprocessing : 0.01 ( 5%) 0.05 ( 33%) 0.05 ( 15%) 1805k ( 2%) parser (global) : 0.03 ( 16%) 0.02 ( 13%) 0.07 ( 21%) 16M ( 23%) parser struct body : 0.00 ( 0%) 0.03 ( 20%) 0.03 ( 9%) 11M ( 15%) parser function body : 0.03 ( 16%) 0.00 ( 0%) 0.03 ( 9%) 3231k ( 4%) parser inl. func. body : 0.01 ( 5%) 0.02 ( 13%) 0.01 ( 3%) 1474k ( 2%) parser inl. meth. body : 0.01 ( 5%) 0.00 ( 0%) 0.03 ( 9%) 5790k ( 8%) template instantiation : 0.07 ( 37%) 0.02 ( 13%) 0.08 ( 24%) 19M ( 27%) constant expression evaluation : 0.00 ( 0%) 0.00 ( 0%) 0.01 ( 3%) 85k ( 0%) expand : 0.00 ( 0%) 0.01 ( 7%) 0.00 ( 0%) 367k ( 0%) integrated RA : 0.00 ( 0%) 0.00 ( 0%) 0.00 ( 0%) 2092k ( 3%) LRA non-specific : 0.00 ( 0%) 0.00 ( 0%) 0.01 ( 3%) 14k ( 0%) symout : 0.01 ( 5%) 0.00 ( 0%) 0.00 ( 0%) 6907k ( 9%) rest of compilation : 0.00 ( 0%) 0.00 ( 0%) 0.01 ( 3%) 212k ( 0%) TOTAL : 0.19 0.15 0.34 73M
我使用的是Ubuntu 22.04系统上的gcc和g++ 11.4.0版本。请问这种情况正常吗?g++通常会比gcc慢这么多吗?还是我的电脑存在潜在问题?
回答
这种情况完全正常,不是你的电脑有问题,g++编译C++代码确实普遍比gcc编译C代码慢不少,核心原因有这几点:
- 模板实例化开销大:从你的
ftime-report能看到,template instantiation(模板实例化)占了编译时间的24%。C++标准库大量依赖模板(比如vector、find都是模板实现),编译时编译器需要为你使用的具体类型(比如vector<int>)生成专属代码,这个过程远比处理C的静态类型复杂。 - 标准库复杂度差异:哪怕只包含几个C++头文件,这些头文件内部也会引入大量模板定义、重载函数、类型别名等内容,编译器需要处理的代码量远大于同等功能的C头文件。比如
vector的实现包含了大量成员函数、迭代器定义,而C的数组完全不需要这些额外处理。 - C++语言特性的额外处理:C++支持重载、名字空间、面向对象等特性,编译器需要完成名字查找、重载决议这些额外工作——从报告里的
name lookup和overload resolution也能看到这些环节的开销,而C语言没有这些特性,编译流程简单得多。
如果想稍微加快编译速度,可以试试这些小技巧:
- 使用预编译头:把常用的C++头文件(比如你注释掉的
<bits/stdc++.h>)预编译,这样每次编译不用重复处理这些头文件内容。 - 配合增量编译工具:用Make、CMake这类构建工具,只编译修改过的代码,避免重复处理未变更的部分。
- 减少不必要的模板使用:竞赛场景下虽然刚需不多,但小代码里能简化的地方可以适当调整。
总的来说,你遇到的0.2-0.3秒编译延迟在C++编译里属于正常范围,尤其是使用标准库模板的情况下,完全不用担心电脑有问题。
内容的提问来源于stack exchange,提问作者VirtualCode
相关产品推荐
相关产品推荐

