私は持っていますこのC89アプレット- それが何をしているのか、どのように機能するのか、そして未定義の動作は重要ではありません。ただし、1つのスレッドでいくつかの長いメモリと数学演算しか実行しない点は異なります。
x, c, * b, m, t, i, a;
g (n) {
for (b = malloc(0); c < n; b[c - 1] = x++, t = 1) {
char s[9];
for (i = m = 0; i < sprintf(s, "%d", x); m += a, t *= a) a = s[i++] - 48;
b = m * t ? x % m + x % t ? b : realloc(b, 4 * ++c) : b;
}
return b[c - 1];
}
main (j) {
printf("%d\n", g(--j));
}
次のようにコンパイルしてくださいgcc -std=c89 tt.c -o tt -O3
。
次に、ループでシェルスクリプトを使用して実行し、時間がどれだけかかるかを確認します。
#!/bin/bash
echo "using input $1"
for _ in `seq 1 10`; do
( time ./tt $(seq 1 $1) ) 3>&1 1>/dev/null 2>&3 \
| grep real \
| cut -f2
# sleep 5
done
次の出力が表示されます。
$ ./tt.sh 50
using input 50
0m0.016s
0m0.008s
0m0.008s
0m0.007s
0m0.007s
0m0.007s
0m0.008s
0m0.008s
0m0.007s
0m0.007s
または次のようになります。
$ ./tt.sh 34
using input 34
0m0.007s
0m0.004s
0m0.004s
0m0.004s
0m0.005s
0m0.004s
0m0.003s
0m0.003s
0m0.003s
0m0.004s
最初の呼び出し以降、プログラムは初期加速で実行され、real
その後のすべての呼び出しはこの誤った加速で実行されます。
# sleep 5
シェルスクリプトからこの行のコメントを外すと、次のようになります。
using input 50
0m0.008s
0m0.020s
0m0.018s
0m0.012s
0m0.009s
0m0.006s
0m0.013s
0m0.012s
0m0.009s
0m0.012s
using input 34
0m0.006s
0m0.007s
0m0.004s
0m0.007s
0m0.008s
0m0.003s
0m0.004s
0m0.004s
0m0.005s
0m0.007s
これらの時間はより予想され、正確に見え、その違いはその瞬間プロセッサのランダムな状態に起因する必要があります(つまり、小さな自然な変化)。
プログラムの平均実行時間を取得するには、この数の平均を求める必要がありますが、sleep 5
各呼び出しの間に10のテストに合計50秒かかります。これがこの動作を停止する唯一の方法ですが、数秒もかかりません。 20のテスト。
私は長い操作(緊密なループ)を繰り返し実行するシングルスレッドプログラムで以前にこれらの「再生キャッシュ」動作を見たことがあり、99.9%の場合これが望ましいことを知っています。
これがハードウェアレベルの一部のIntel Magic™の結果ではないと仮定すると、LinuxカーネルまたはBashが意図的に実行する作業ですか?どうやって防ぐことができますか?
sleep 5
キャッシュの影響を受ける時間は毎回コールドスタートを表していないので、ingなしで「コールドスタート」からライブラリのロードとページングを含む私のプログラムに再現可能なランタイムを持たせたいと思います。
答え1
私の意見で言ったように:
おそらく役に立ちません。ただし、各呼び出しの前に「echo 3> /proc/sys/vm/drop_caches」を試してください。
tt
質問者の回答:
はい、echo 1 | sudo tee /proc/sys/vm/drop_cachesは私が望むものです(代わりにecho 3は奇妙な結果をもたらします)。これを答えとして入れなければなりません
価値記録:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches