2011年09月26日

bash で echo 出力を受け取る関数の呼び出しとその遅さ

bash シェル・スクリプトの関数は、通常 0〜255 の値を返り値にすることができますが、通常この値は、エラーコードとして用いられます。 では、関数から返り値を返したいときはどのようにすればいいのかというと、echo 出力を取得する方法です。

function FuncA_func()
{
echo "Hello" #// 返り値
}

echo "`FuncA_func 2`" #// 関数コール。 Hello を表示する

関数呼び出しは、echo の引数の中で行っています。 ただし、この方法には問題があって、引数の中から呼び出す FuncA_func 関数の中でエラーが発生した場合、そのエラーは無視されてしまうからです。 関数呼び出しを代入の右辺にすれば、エラーは無視されません。

ret=`FuncA_func 2`
echo "$ret" #// 関数コール。 Hello を表示する

しかし、この方法も、問題があります。 ` ` を使った関数呼び出しは、サブ・シェル(子プロセス)を呼び出しているために、オーバーヘッドが大きいのです。(また、サブ・シェルの中でグローバル変数を修正しても、関数から戻ると修正内容は反映されません。)

通常の関数呼び出し: 1秒/1万回の呼び出し
` ` の関数呼び出し:40秒/1万回の呼び出し
(仮想環境を使用)

このオーバーヘッドは、かなり大きく、たとえば、開発中の bashlib にある InputPath_func 関数を呼び出すたびに 3秒待たされてしまいます。 bashlib の開発当初は、InputPath_func は速かったのですが、エスケープ記号でも使えるようにすることなど、指定できる引数に制限をなくしていったところ、だんだん遅くなってしまったのです。

bashlib のリリースのために不具合を修正をしていったところ、この問題が発生してしまったため、今月中のリリースが怪しくなってしましました。

sage_p at 08:01│Comments(0)TrackBack(0) プログラミング 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔