Bashループはループコアより1000倍高価です。

Bashループはループコアより1000倍高価です。

以下は少し実験です。

t1=$(date +%s%N)
ta=0
for i in `seq 1 1000`
do
    t1a=$(date +%s%N)
    echo blabla
    t2a=$(date +%s%N)
    ((ta=ta+(t2a-t1a)))
done
t2=$(date +%s%N)
echo diffb: $((t2-t1))ns
echo diffba: $((t2a-t1a))ns

結果:

diffb: 2767264439ns # this is the overall result
diffba: 1482172ns # this is the aggregated result for the core

今、人々が考えているものを見ることができます。これは明らかにループの中心にあるツールです。しかし。 IOタスク、ソート、uniq、if、cp ...を含むより複雑なループでこれを見ました。数回実行した後、全体のループコストが100xから1000xの間になりました!

しかし、確実にするecho blablaためにdate +%s%N。結果:

diffb: 3713962570ns
diffba: 2662492ns

これは確かに楽器ではありません!

いいですね。以下を試してください。

a=0; while [[ $((a++)) -lt 1000 ]];

結果:

diffb: 3761656210ns
diffba: 1953502ns

ここで何か抜けましたか?ここでこれらの結果が間違っている理由は明らかに示されていますか?それとも、私が現実を偶然発見したのでしょうか? Bashループは宇宙で最も高いオーバーヘッドを持っていますか?

(コードを最適化したいのでベースライン測定を始めましたが、最適化はできないようです。)

編集:別の操作を実行して、繰り返し回数を1000から500に減らしました(この場合はwhileループを使用しました)。結果は次のとおりです。

diffb: 1886513017ns
diffba: 2328892ns

比較:

diffb: 3761656210ns
diffba: 1953502ns

コアが非線形時間、継続的な初期化、カーネルキャッシュなどに達したため、ループオーバーヘッドのようです。

ベストアンサー1

エラーは最後の行にあります。

1回の繰り返し時間を計算します。 1000回繰り返すより1000倍遅いです。

おすすめ記事