sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

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