プロセス/アプリケーションで実行されているときは常に結果/プロセスをキャッシュするため、real
プロセスに時間を提供していないようです。
私は試した:
sync; time process
そして
sync -f; time process
しかし、実際にキャッシュを無効にしないようです。
繰り返し実行するか、time process
上記の例のように実行時間が変更されることがわかります(キャッシュのためであると疑われます)。sync -f; time process
sync; time process
ライブプロセスを提供するために実際にキャッシュを無効にする方法はありますか?
答え1
time
使用する子プロセスのリソース使用量を表示します(カーネルで測定)。getrusage
これを行うには(Linuxでは、次を使用します。)wait4
。測定中の特定の実行に使用されたリアルタイム時間を測定します。
表示される変更は、プロセスの実行中に発生した変更を反映します。原因は多様であり、一般に、ある種または他の種類の資源競合に関連する。すべてのベンチマークと同様に、time
事前定義されたシナリオでのみ使用することをお勧めします。
外部の影響なしにコマンドの実行時間を測定することは(ほとんど)可能ですが、多くの設定作業が必要です。 Linuxでは、次のことができます。すべてのディスクキャッシュを事前にフラッシュします。:
echo 3 > /proc/sys/vm/drop_caches
(プロセス実行の結果は、CPUキャッシュの少量を除いてどこにもキャッシュされません。ただし、プロセス自体が独自のメモリを実行して再実行したときにタスクを実行しない限り -例えば。ccache
)
カーネルで使用されていない専用CPUで測定したいコマンドを実行することもでき、割り込みやスケジュール変更の影響を受けずにキャッシュフラッシュの影響を受けにくくなります。念頭に置いておくべき他の要素には、CPU周波数の変更、ハイパースレッディング、アドレス空間のランダム化などがあります。
私の同僚の一人であるVictor Stinnerが記事を書いた。ベンチマークのトピックに関する彼のメモとリンク、Pythonのベンチマークに焦点を当てた良い調整セットを提供するリンクは次のとおりです。Linuxで一貫した結果を得るためのDenis Bakhvalovのガイド。
答え2
ダーティキャッシュを完全に無効にすることもできますが、これによりカーネルが書き込み操作を最適化できるため、書き込み速度に重大な影響を与える可能性がある非常に不快な効果がある可能性があります。たとえば、次のようになります。
sudo sysctl vm.dirty_background_bytes=4096
sudo sysctl vm.dirty_bytes=8192
キャッシュに関する良い記事:https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/