行数の数え方
2008-05-23


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

[JavaScript]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット