初歩のシェルスクリプトで遊ぶ[ファイルのリネームツール、のようなもの?_(6)]
#!/bin/bash # ============================================ # 配列は1つずつ読み出すべきか? # ============================================ echo '配列を3つ作る' ARR1=(`seq 0 1234567`) ARR2=(`seq 0 1234567`) ARR3=(`seq 0 1234567`) SECONDS=0 echo '1つのforループの中で、3つの配列を読み出す / 10' for N in `seq 0 123456` ; do echo ${ARR1[N]} ${ARR2[N]} ${ARR3[N]} done 1>/dev/null echo ${SECONDS} read SECONDS=0 echo '1つのループで1つの配列を読み出すx3' for N in `seq 0 1234567` ; do echo ${ARR1[N]} done 1>/dev/null for N in `seq 0 1234567` ; do echo ${ARR2[N]} done 1>/dev/null for N in `seq 0 1234567` ; do echo ${ARR3[N]} done 1>/dev/null echo ${SECONDS} read SECONDS=0 echo 'pasteとプロセス置換' for N in `seq 0 1234567` ; do echo ${ARR1[N]} done | paste -d " " - \ <( for N in `seq 0 1234567` do echo ${ARR2[N]} ; done ) \ <( for N in `seq 0 1234567` do echo ${ARR3[N]} ; done ) >/dev/null echo ${SECONDS}
配列を3つ作る 1つのforループの中で、3つの配列を読み出す / 10 328 1つのループで1つの配列を読み出すx3 42 pasteとプロセス置換 32
「配列1/配列2/配列3」って感じで、配列を区切り文字で一列にして、標準出力から出す、というのをやってたら、なんか遅くなったなと。書き換えたときに。
ループの中で複数の配列を一つずつ読み出すと、結果だけ見れば、かなり遅い。
プロセス置換すれば複数コアを使ってくれてるけど、あんまり、こういう書き方はしたくないやね。速くても。
Ubuntu18.04のbashの話です。上のは。バージョン4、何だったか。
Ubuntu20.04にアップグレードしたら、上記の問題は消えました。普通に一つのループで全部読みだすのが、いちばん早い。
なんかあったんすかね。改善とかいろいろと。