高速な文字列処理

1997.3.6


 文字列を扱うとき、直接文字列同士を結合するより、いったん文字列のリストとして結合してから文字列に変換する方が高速だというのはかなり以前から知られています。

 例えば次の二つのスクリプトを比較すると、リストの方がわずかに高速です。

  set theString to ""
  set theString to theString & "abcdefghijklmnopqrstuvwxyz"

  set theList to {"a"}
  set end of theList to "abcdefghijklmnopqrstuvwxyz"

 もちろんたった1度の処理であれば、両者の間にほとんど差はありません。しかし繰り返し構文などで処理回数が多い場合、このわずかな差がスクリプト全体の処理速度に大きく影響してきます。

 例えば次の例では、その差が現れてきます。

  set theString to ""
  repeat 1000 times
    set theString to theString & "abcdefghijklmnopqrstuvwxyz"
  end repeat


  set theList to {}
  repeat 1000 times
    set end of theList to "abcdefghijklmnopqrstuvwxyz"
  end repeat
  set CurDelim to AppleScript's text item delimiters
  set AppleScript's text item delimiters to ""
  set theList to theList as string
  set AppleScript's text item delimiters to CurDelim

 筆者の環境では、文字列の例が11.4秒、リストの例が4.3秒となり、両者の所用時間差が7.1秒にもなりました。この例では約2.7倍リストの方が高速です。リストの処理時間と時間差を比べれば、極めて大きな差であることがわかると思います。

 ちなみに両者の処理時間の差は、付加する文字列が大きいほど大きくなります。例えば上の例で文字列を"abc"とした場合、両者にほとんど差はありません。しかし上の例以上の長大な文字列の場合、その差はさらに大きくなります。

 また、同じリストによる文字列操作であっても、やり方によってはかなりの差が現れます。

 例えば次の例は、上のリストの例と内容もほとんど同じで、同じ結果を返しますが、処理時間はまるで違います。

  set theList to {}
  repeat 1000 times
    set theList to theList & "abcdefghijklmnopqrstuvwxyz"
  end repeat
  set CurDelim to AppleScript's text item delimiters
  set AppleScript's text item delimiters to ""
  set theList to theList as string
  set AppleScript's text item delimiters to CurDelim

 これは処理に8.8秒を要しました。ただリストの連結方法が違うだけでです。


 この方法は、文字列の連結を何度も行う場合、特に有効です。データベースからHTMLファイルを作成したりテキストファイルを結合したりするスクリプトに使うと、劇的に実行速度が上がる場合があります。そのようなスクリプトを作っている人は、一度試してみるといいかもしれません。

 以上、文字列およびリストの扱いを高速にするためのTipでした。


Tipsに戻る
AppleScriptのページに戻る
このホームページに関するお問い合わせは、karino@drycarbon.comまで。