我刚刚发现了@tony-d的这个答案,其中包含一个用于测试虚函数调用开销的代码示例。我使用
g++
检查了此基准:$ g++ -O2 -o vdt vdt.cpp -lrt
$ ./vdt
virtual dispatch: 150000000 0.128562
switched: 150000000 0.0803207
overheads: 150000000 0.0543323
...
我的性能比他要好(比例约为2),但后来我用 clang
进行了检查:
$ clang++-3.7 -O2 -o vdt vdt.cpp -lrt
$ ./vdt
virtual dispatch: 150000000 0.462368
switched: 150000000 0.0569544
overheads: 150000000 0.0509332
...
现在比例已经达到了约70!
然后我注意到了-lrt
命令行参数,在对librt
进行了一些谷歌搜索之后,我尝试着将其从g++
和clang
中去掉:
$ g++ -O2 -o vdt vdt.cpp
$ ./vdt
virtual dispatch: 150000000 0.4661
switched: 150000000 0.0815865
overheads: 150000000 0.0543611
...
$ clang++-3.7 -O2 -o vdt vdt.cpp
$ ./vdt
virtual dispatch: 150000000 0.155901
switched: 150000000 0.0568319
overheads: 150000000 0.0492521
...
正如您所见,性能被交换了。
根据我对librt
的了解,它是clock_gettime
和其他相关时间计算所需的(也许我错了,在这种情况下请纠正我!)但是代码在没有-lrt
的情况下编译得很好,并且从我看到的时间来看,时间似乎是正确的。
为什么链接/不链接librt
会如此影响该代码?
关于我的系统和编译器的信息:
$ g++ --version
g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204
Copyright (C) 2015 Free Software Foundation, Inc.
$ clang++-3.7 --version
Debian clang version 3.7.1-svn254351-1~exp1 (branches/release_37) (based on LLVM 3.7.1)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ uname -a
Linux ****** 3.13.0-86-generic #130-Ubuntu SMP Mon Apr 18 18:27:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
-O3
,而在另一个情况(没有使用rt)中,则是-O2
。这些结果是不可比较的。您能否在第一个情况下也尝试使用-O2
? - EmDroid-O2
和-O3
的测试,结果完全相同(我已经更正了问题)。 - Holt