201508-type.sh (2401B)
1 #!/usr/bin/env bash 2 3 if [[ ! ${BLE_VERSION-} ]]; then 4 source ../../src/benchmark.sh 5 fi 6 7 function dummy-function { 8 echo hello 9 } 10 11 function type.1 { 12 ret="$(type -t "$1" 2>/dev/null)" 13 } 14 function type.2 { 15 type -t "$1" > a.tmp 2>/dev/null 16 ret="$(< a.tmp)" 17 } 18 function type.3 { 19 ret= 20 type -t "$1" > a.tmp 2>/dev/null 21 IFS= read -r ret < a.tmp 22 } 23 function type.4 { 24 local arr 25 type -t "$1" > a.tmp 2>/dev/null 26 mapfile -t arr < a.tmp 27 ret="${arr[*]}" 28 } 29 30 # check 31 type.1 dummy-function && [[ $ret == function ]] || return 1 32 type.2 dummy-function && [[ $ret == function ]] || return 2 33 type.3 dummy-function && [[ $ret == function ]] || return 3 34 type.4 dummy-function && [[ $ret == function ]] || return 4 35 36 # 計測 37 function line { 38 echo ---------- ---------- ---------- ---------- 39 } 40 41 ifold -i -s -w 80 <<EOF 42 type -t の結果を取得する為に現在 \$() を使用している。\ 43 この方法だと一回 fork が必要になるので遅いのではないかという懸念がある。\ 44 ファイルに出力してそれを読み取る様にしてしまえば実は速いのではないかという話。 45 46 type.1 47 \$() を用いて実行 48 type.2 49 一回ファイルに出力してからそれを読み取る 50 ファイルからの読み取りには \$(< filename) を用いる。 51 どうやらこの方法を用いたとしても内部的に fork はする様だ。 52 type.3 53 ファイルに出力して read で読み取る(1行目だけ読み取れれば良いので read でOK)。 54 type.4 55 ファイルに出力して mapfile で読み取る。 56 57 padparadscha で試してみた所、read/mapfile を用いた type.3/type.4 が fork する type.1/type.2 よりも3倍程度速いという事が分かった。\ 58 read/mapfile の違いは殆どないが mapfile の方が微妙に早いように思われる。\ 59 但し、mapfile は最近の bash にしか存在していないので、実際には read を用いるのが現実的であると思われる。 60 61 gauge では type.1/type.2 は 70ms 程度かかるが、type.3/type.4 は 1.8ms/1.4ms と30倍程度速い。\ 62 cygwin 環境では type.3/type.4 の様な一度ファイルに書き出す方式の方が断然良いという事である。 63 EOF 64 line 65 ble-measure type.1 dummy-function 66 line 67 ble-measure type.2 dummy-function 68 line 69 ble-measure type.3 dummy-function 70 line 71 ble-measure type.4 dummy-function 72 rm a.tmp