行数の数え方2008年05月23日 11時56分

行数を数えているのですが、コメント欄他のstr.split(/\n/).lengthはかっこいいけどoverkill

404 Blog Not Found:javascript - String.prototype.tr() released

本当でしょうか? 実際に試してみましょう。変数 s が対象文字列を指しているものとします。

// charAt
var lines = 1;
for (var i = 0, n = s.length; i < n; i++)
  if (s.charAt(i) == "\n")
    lines++;
// Array
var lines = 1;
var chars = s.split("");
for (var i = 0, n = chars.length; i < n; i++)
  if (chars[i] == "\n")
    lines++;
// split
var lines = s.split("\n").length;
// match
var lines = (s.match(/\n/g) || []).length + 1;
// match (番兵)
var lines = (s + "\n").match(/\n/g).length;
// indexOf
var lines = 1;
var i = -1;
while ((i = s.indexOf("\n", i + 1)) >= 0)
  lines++;
// replace
var lines = s.length - s.replace(/\n/g, "").length + 1;
行数カウントの実行時間 (10000 回、単位はミリ秒)
改行を含む文字列 改行を含まない文字列
SpiderMonkey 1.8 JScript 5.7 SpiderMonkey 1.8 JScript 5.7
charAt 468 1656 389 1360
Array 463 1047 382 859
split 108 172 78 63
match 502 203 73 78
match (番兵) 543 250 185 110
indexOf 95 250 13 31
replace 446 94 82 62

見ての通り、charAt メソッドで一文字ずつチェックしていくよりも、split メソッドを使ったほうが実行速度は速くなります。特に JScript ではその差が顕著です。

ところで、JavaScript は高級言語であり、一般の JavaScript 処理系ではソースコードの解釈・実行時に多くの最適化がなされます。最適化技術は日々進歩しており、今日一番速かった書き方が明日もそうである保証はどこにもありません。アルゴリズムから変えるとかならともかく、下手に速度を求めて変な書き方をするよりは簡潔な書き方を心がけたほうがいいと思います。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
「ハイパーテキストマークアップ言語」をアルファベット4文字でいうと?

コメント:

トラックバック

このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2008/05/23/3537480/tb

_ blanket-log - 2008年05月23日 19時50分

行数の数え方 - Days on the Moon たいへん興味深い結果。いろいろ気になったので、もう少し突っ込んで実験してみました。 実験: でかい文字列だとどうなるか? 1Mバイトぐらいの文字列で2通り試してみました。 (A)1000文字ごとに改行(B)1文字ごとに改行 charAt21674386 Arr