¿Por qué los enlaces a librt intercambian el rendimiento entre g ++ y clang?

Acabo de encontraresta respuesta de @ tony-d con un código de banco para probar la sobrecarga de llamadas de funciones virtuales. Lo comprobé es referencia usandog++:

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

Obtuve un mejor rendimiento que el suyo (la relación es de aproximadamente 2), pero luego verifiqué conclang:

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

¡Ahora la proporción sube a aproximadamente 70!

Entonces noté el-lrt argumento de línea de comando, y después de buscar un poco en Googlelibrt Lo intenté sin él porg++ yclang:

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

Como puede ver, el rendimiento esintercambiado.

Por lo que encontré sobrelibrt, es necesario paraclock_gettime y otro cálculo de tiempo relacionado (tal vez estoy equivocado, ¡corrígeme en este caso!) pero el código se compila bien sin-lrt, y el tiempo parece correcto por lo que veo.

¿Por qué enlazar / no enlazarlibrt afecta tanto a ese código?

Información sobre mi sistema y compiladores:

$ 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

Respuestas a la pregunta(1)

Su respuesta a la pregunta