プログラミングを本格的に学び始めてから5年以上たつけど、先日まで勘違いしていたこと。
for文の例でよくfor(i=0; i<100; i++)
と三つ目の式(再初期化式というらしい)を後置インクリメントで書くコードをよく見るもんだから、てっきりここを前置インクリメントにしたらiが0からではなく、1から始まるもんだと思ってました。
まあそれはともかく、タイトルについて。先日for文の三つ目の式が後置だろうが前置だろうが一緒の結果になると知ったと同時に、知りました。
まあ、言われてみれば前置インクリメントがただプラス1するだけの演算にたいして、後置インクリメントは1拍遅れてプラス1するからなぁ(ん? 今ググって確認してみたけど、この理解もしかして間違ってる?)。
というわけで、JavaScriptで以下のようなコードを書いてChromeで試してみた。
var i, j; console.time("後置インクリメント"); for(i = 0; i <= 100000; i++) { for(j = 0; j <= 100000; j++) { } } console.timeEnd("後置インクリメント"); console.time("前置インクリメント"); for(i = 0; i <= 100000; ++i) { for(j = 0; j <= 100000; ++j) { } } console.timeEnd("前置インクリメント");
これを二度実行した結果。
後置インクリメント: 9971ms
前置インクリメント: 9909ms
後置インクリメント: 10058ms
前置インクリメント: 10194ms
前置インクリメント: 9909ms
後置インクリメント: 10058ms
前置インクリメント: 10194ms
ありゃ・・・。前半は確かに前置のほうが速いけど、後半は後置のほうが速い・・・。
後になるほど遅くなってしまうのかなと思い、後置と前置の順番を逆にしてみた。
前置インクリメント: 9918ms
後置インクリメント: 9881ms
前置インクリメント: 9941ms
後置インクリメント: 9907ms
後置インクリメント: 9881ms
前置インクリメント: 9941ms
後置インクリメント: 9907ms
ありゃ・・・。今度はどちらも後置のほうが速い・・・。
仕方がないので、FirefoxのFirebugでも試してみることに。
前置インクリメント: 25188ms
後置インクリメント: 24496ms
前置インクリメント: 22423ms
後置インクリメント: 22120ms
後置インクリメント: 24496ms
前置インクリメント: 22423ms
後置インクリメント: 22120ms
予想通りの結果にならないし、『警告:応答のないスクリプト』というアラームが何回もでるし・・・。
おかしいなぁ。自分が見たのはJavaScriptの高速化の話だったのだけれども・・・。どこか間違えただろうか。
コメント