コードのスニペットの時間を測定しようとしていたところ、gnome ターミナルで起動した bash シェルから実行した場合と比較して、エディター QtCreator 内からプログラムを実行した場合の方がタイミングが約 50ns 速いことに気付きました。OSはUbuntu20.04を使用しています。
私の問題を再現するための小さなプログラム:
#include <stdio.h>
#include <time.h>
struct timespec now() {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return now;
}
long interval_ns(struct timespec tick, struct timespec tock) {
return (tock.tv_sec - tick.tv_sec) * 1000000000L
+ (tock.tv_nsec - tick.tv_nsec);
}
int main() {
// sleep(1);
for (size_t i = 0; i < 10; i++) {
struct timespec tick = now();
struct timespec tock = now();
long elapsed = interval_ns(tick, tock);
printf("It took %lu ns\n", elapsed);
}
return 0;
}
QtCreator 内から実行した場合の出力
It took 84 ns
It took 20 ns
It took 20 ns
It took 21 ns
It took 21 ns
It took 21 ns
It took 22 ns
It took 21 ns
It took 20 ns
It took 21 ns
そして、ターミナル内のシェルから実行する場合:
$ ./foo
It took 407 ns
It took 136 ns
It took 74 ns
It took 73 ns
It took 77 ns
It took 79 ns
It took 74 ns
It took 81 ns
It took 74 ns
It took 78 ns
私が試したものの違いはありませんでした
- QtCreator にターミナルでプログラムを開始させる
- clock_gettime の代わりに rdtsc および rdtscp 呼び出しを使用する (実行時の相対的な違いは同じ)
- で実行してターミナルから環境をクリアする
env -i
- bash の代わりに sh を使用してプログラムを起動する
すべてのケースで同じバイナリが呼び出されることを確認しました。すべての場合において、プログラムの nice 値が 0 であることを確認しました。
質問
シェルからプログラムを起動すると違いが生じるのはなぜですか? 何を試すべきかについての提案はありますか?
アップデート
main の先頭に sleep(1) 呼び出しを追加すると、QtCreator と gnome-terminal/bash の両方の呼び出しで実行時間が長くなることが報告されます。
main の先頭に system("ps -H") 呼び出しを追加し、前述の sleep(1) を削除すると、両方の呼び出しで短い実行時間 (~20 ns) が報告されます。