我刚从@ tony-d找到了this answer,用一个替代码来测试虚函数调用开销。我使用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
...
如您所见,性能 swaped 。
根据我发现的librt
,需要clock_gettime
和其他相关的时间计算(可能我错了,在这种情况下纠正我!)但是代码编译没有{{1从我看到的时间看起来是正确的。
为什么链接-lrt
会影响该代码呢?
关于我的系统和编译器的信息:
librt