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