Warum funktioniert die Verknüpfung mit der Librt-Swap-Leistung zwischen g ++ und clang?

Ich habe gerade gefundendiese Antwort from @ tony-d mit einem Bankcode zum Testen des Overheads für virtuelle Funktionsaufrufe. Ich überprüfte ist Benchmark mitg++:

$ g++ -O2 -o vdt vdt.cpp -lrt
$ ./vdt
virtual dispatch: 150000000 0.128562
switched: 150000000 0.0803207
overheads: 150000000 0.0543323
...

Ich habe eine bessere Leistung als seine (Verhältnis ist etwa 2), aber dann habe ich mit @ überprüclang:

$ clang++-3.7 -O2 -o vdt vdt.cpp -lrt
$ ./vdt
virtual dispatch: 150000000 0.462368
switched: 150000000 0.0569544
overheads: 150000000 0.0509332
...

etzt steigt das Verhältnis auf etwa 7

Ich bemerkte dann die-lrt Kommandozeilenargument und nach ein wenig googeln überlibrt Ich habe versucht, ohne es fürg++ undclang:

$ 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
...

ie Sie sehen können, ist die Leistung getauscht.

Von dem, was ich über @ gefunden halibrt, wird benötigt fürclock_gettime und andere verwandte Zeitberechnungen (vielleicht irre ich mich, korrigiere mich in diesem Fall!), aber der Code lässt sich ohne @ problemlos kompiliere-lrt, und die Zeit scheint von dem, was ich sehe, korrekt zu sein.

Warum verlinken / nicht verlinkenlibrt beeinflusst diesen Code so sehr?

Informationen über mein System und meine Compiler:

$ 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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage