行数の数え方 ― 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;
改行を含む文字列 | 改行を含まない文字列 | |||
---|---|---|---|---|
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: 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
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。