expr vs. let


0. Contents

1.Concept
2.Test Script
3.Run Test
4.Summary


1. Concept

expr は式を評価し、その結果を標準出力に書き出すコマンドで
let は算術式を評価する bash の builtin コマンドである。
両者とも数式を評価したり、変数に代入する事ができるが
数式のみを扱う場合の処理速度を比較してみた。


2. Test Script

比較の為のスクリプトを作成した。
ソースは以下の通り。

#! /usr/bin/env bash
declare -i a=0 b=1000

test1(){
  local a="$a" b="$b"
  while [ "$a" -lt "$b" ] ; do
    a=$(expr "$a" + 1)
  done
}

test2(){
  local a="$a" b="$b"
  while [ "$a" -lt "$b" ] ; do
    let a="$a + 1"
  done
}

test3(){
  local a="$a" b="$b"
  while [ "$a" -lt "$b" ] ; do
    let a++
  done
}

test4(){
  local a="$a" b="$b"
  while [ "$a" -lt "$b" ] ; do
    (( a++ ))
  done
}

time test1
time test2
time test3
time test4
exit


3. Run Test

上記のスクリプトの実行結果。

test1: a=$(expr "$a" + 1)
real    0m11.976s
user    0m9.390s
sys     0m2.590s

test2: let a="$a + 1"
real    0m0.091s
user    0m0.090s
sys     0m0.000s

test3: let a++
real    0m0.080s
user    0m0.080s
sys     0m0.000s

test4: (( a++ ))
real    0m0.076s
user    0m0.060s
sys     0m0.010s


4. Summary

数式の算出をするという目的においては expr より let の方がはるかに高速であり、
シェルスクリプト (bash) において数字を一つ加えるという処理は

(( a++ ))

と書くのが最適であると言える。