質問: 可変コンテンツを読み取るよりもファイルを開く方が速いのはなぜですか? bashスクリプトでは、/proc/ファイルのさまざまな値が必要です。今までは、何十行ものファイルを直接次のようにgreppingしています。grep -op '^memfree: *\k[0-9]+' /proc/meminfo これをより効率的にするために、ファイルの内容を変数に保存し、それをgrepしました。a=$(</proc/meminfo) echo "$a" | grep -op '^memfree: *\k[0-9]+' ファイルを複数回開くのではなく、これを1回開いて変数の内容をgrepするだけです。これは私が高速であると想定していましたが、実際は低速です。bash 4.4.19 $ time for i in {1..1000};do grep ^memfree /proc/meminfo;done >/dev/null real 0m0.803s user 0m0.619s sys 0m0.232s bash 4.4.19 $ a=$(</proc/meminfo) bash 4.4.19 $ time for i in {1..1000};do echo "$a"|grep ^memfree; done >/dev/null real 0m1.182s user 0m1.425s sys 0m0.506s dashとzshについても同様です。 /proc/ファイルの特別な状態を理由として疑いましたが、/proc/meminfoの内容を通常のファイルにコピーし、結果が同じであることを使用した場合:bash 4.4.19 $ cat </proc/meminfo >meminfo bash 4.4.19 $ time for i in $(seq 1 1000);do grep ^memfree meminfo; done >/dev/null real 0m0.790s user 0m0.608s sys 0m0.227s パイプを保存するためにhere文字列を使用すると、パイプの速度はわずかに速くなりますが、ファイルほど高速ではありません。bash 4.4.19 $ time for i in $(seq 1 1000);do <<<"$a" grep ^memfree; done >/dev/null real 0m0.977s user 0m0.758s sys 0m0.268s 変数から同じコンテンツを読み取るよりもファイルを開く方が速いのはなぜですか?
回答: 最初のケースでは、grepユーティリティを使用して、ファイル/proc/meminfoから何かを見つけているだけです。/procは仮想ファイルシステムであるため、/proc/meminfoファイルはメモリ内にあり、コンテンツを取得します。ただし、2番目のケースでは、パイプを作成し、このパイプを使用して最初のコマンドの出力を2番目のコマンドに渡すため、コストがかかります。違いは、/proc(メモリ内にあるため)とパイプのためです。以下の例を参照してください。time for i in {1..1000};do grep ^memfree /proc/meminfo;done >/dev/null real 0m0.914s user 0m0.032s sys 0m0.148s cat /proc/meminfo > file time for i in {1..1000};do grep ^memfree file;done >/dev/null real 0m0.938s user 0m0.032s sys 0m0.152s time for i in {1..1000};do echo "$a"|grep ^memfree; done >/dev/null real 0m1.016s user 0m0.040s sys 0m0.232s