STL版本是否针对编译时间进行了优化?

时间:2010-04-21 01:15:58

标签: c++ stl containers

我正在寻找STL的一个变体(如果它没有所有的功能就没关系),它是针对短编译次优化的 - 我被延迟的长编译时间所困扰我的编译 - 调试 - 编辑周期。

我主要对STL的容器感兴趣:vector / map,而不是算法。

谢谢!

4 个答案:

答案 0 :(得分:5)

查看编译器预编译头文件的选项。例如,In GCC传递标题就像它是一个源一样导致它被预编译。

我的小测试显着缩短了时间,但前提是你不计算预编译的时间:

Shadow:code dkrauss$ ls maps*
maps.cpp    maps.h      maps2.cpp
Shadow:code dkrauss$ cat maps*
#include "maps.h"
using namespace std;

map<int,int> ints;
map<string, string> strings;
map<int, string> is;
map<string, int> si;

int main() {
bang(ints);
bang(strings);
bang(is);
bang(si);

extern void more();
more();
}
#include <string>
#include <map>

template< class K, class V >
void bang( std::map<K,V> &v ) {
v[ K() ] = V();
v.erase( v.begin() );
}

#include "maps.h"
using namespace std;

map<int,int> ints2;
map<string, string> strings2;
map<int, string> is2;
map<string, int> si2;

void more() {
bang(ints2);
bang(strings2);
bang(is2);
bang(si2);
}
Shadow:code dkrauss$ time g++ maps*.cpp -o maps

real    0m1.091s
user    0m0.857s
sys 0m0.132s
Shadow:code dkrauss$ time g++ maps.h

real    0m0.952s
user    0m0.406s
sys 0m0.110s
Shadow:code dkrauss$ ls maps*
maps        maps.cpp    maps.h      maps.h.gch  maps2.cpp
Shadow:code dkrauss$ time g++ maps*.cpp -o maps

real    0m0.718s
user    0m0.552s
sys 0m0.095s
Shadow:code dkrauss$ 

答案 1 :(得分:1)

由于STL在很大程度上依赖于模板,因此编译器能够以多快的速度处理基于模板的代码。 GCC一直在提高每个新版本编译模板代码的速度,因此您可能需要考虑更新编译器。但是,除此之外,您无法做很多事情来加速基于模板的代码。其他一些编译标志可以提高构建速度;例如,省略优化标志将使编译更快,并且使用预编译头也可以大大加快编译速度。如果您的计算机具有多个内核,则许多构建系统会并行支持编译(例如,make使用“-j”标志,如“-j 2”中所示,以指定多少个内核)。我还应该指出,你只需支付你使用的费用;如果你包括&lt; vector&gt;和&lt; map&gt;但不是&lt; algorithm&gt;,那么你根本就不会支付它...所以如果你包括它但不使用它,那么就停止包括它。

答案 2 :(得分:0)

由于您只对部分STL感兴趣,您是否考虑过对头文件进行分支,以便不包含未使用的内容。

答案 3 :(得分:0)

买一台更快的电脑? :)说真的,我们发现模板确实耗费了链接时间。为了解决这个问题,我们只将当前正在调试的模块保留为完全调试模式(-o0)。我们编译到0以上的某个优化级别的其他模块不会为链接器生成几乎同样多的死代码。