Я только что нашел этот ответ от @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