sistema_progs

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

201512-setvalue.sh (2384B)


      1 #!/usr/bin/env bash
      2 
      3 if [[ ! ${BLE_VERSION-} ]]; then
      4   source ../../src/benchmark.sh
      5 fi
      6 
      7 ifold -s -w 80 -i <<EOF
      8 
      9 変数名が不明の場合に値を設定する方法について。
     10 printf -v を用いた配列名に対する代入は bash-4.1 以降でしかできない。
     11 
     12 比較してみたが eval を用いても、関数呼出で printf を用いても大差ないようだ。\
     13 記述が簡単になる関数呼出で printf を用いる方法を採用する事にする。\
     14 bash-4.1 未満の場合には保険の為、関数呼出で eval を用いる方法にする。
     15 
     16 builtin eval, builtin printf, builtin read 等のように builtin を開始呼び出すと、\
     17 関数内では 3.5 us 程度ずつ、直接 eval だと 5.8us ずつ遅くなる様である。\
     18 全体の処理時間に比べれば 5% - 20% 程度である。余り気にしなくて良いと思う。
     19 
     20 EOF
     21 
     22 hello=12345 var=hello value=12345
     23 ble-measure 'hello=12345'
     24 ble-measure '(($var=value))'
     25 ble-measure 'printf -v "$var" %s "$value"'
     26 ble-measure 'eval "$var=\"\$value\""'
     27 ble-measure "IFS= read -r -d '' \"\$var\" <<< \"\$value\""
     28 
     29 flag_function_assign=
     30 
     31 if [[ $flag_function_assign ]]; then
     32   function ble/util/set.printf {
     33     printf -v "$1" %s "$2"
     34   }
     35   function ble/util/set.eval {
     36     eval "$1=\"\$2\""
     37   }
     38   function ble/util/set.read {
     39     IFS= read -r -d '' "$1" <<<"$2"
     40   }
     41   ble-measure 'ble/util/set.printf "$var" "$value"'
     42   ble-measure 'ble/util/set.eval "$var" "$value"'
     43   ble-measure 'ble/util/set.read "$var" "$value"'
     44 
     45   # function ble/util/set.eval.2 {
     46   #   builtin eval "$1=\"\$2\""
     47   # }
     48   # function ble/util/set.printf.2 {
     49   #   builtin printf -v "$1" %s "$2"
     50   # }
     51   # function ble/util/set.read.2 {
     52   #   IFS= builtin read -r -d '' "$1" <<<"$2"
     53   # }
     54   # ble-measure 'ble/util/set.eval.2 "$var" "$value"'
     55   # ble-measure 'ble/util/set.printf.2 "$var" "$value"'
     56   # ble-measure 'ble/util/set.read.2 "$var" "$value"'
     57 fi
     58 
     59 mem=/dev/shm/$UID
     60 memtmp=$mem/$$.tmp
     61 > $memtmp || (umask 077; mkdir -p "$mem")
     62 
     63 ble-measure 'echo hello > $memtmp && IFS= read -r -d "" result < $memtmp'
     64 ble-measure 'echo hello > $$.tmp && IFS= read -r -d "" result < $$.tmp'
     65 ble-measure 'result=$(echo hello)'
     66 
     67 ble-measure 'date > $memtmp && IFS= read -r -d "" result < $memtmp'
     68 ble-measure 'date > $$.tmp && IFS= read -r -d "" result < $$.tmp'
     69 ble-measure 'result=$(date)'
     70 
     71 rm -f "$$.tmp" "$memtmp"