0
0

More than 3 years have passed since last update.

javascriptの++iはi++より早いのか?

Posted at

C言語やjavascriptなどのプログラミング言語にはインクリメント演算子がある。

インクリメント演算子は変数の数値を1加算する動作する。

i++ // 後置インクリメント
++i // 前置インクリメント

インクリメント演算子には前置インクリメントと後置インクリメントがあり、違いは評価値が違うこと。
前置インクリメントは1加算したあとの値、後置インクリメントは1加算する前の値を評価値として返す。

C言語では++iはi++より早い

C言語だと++iはi++よりパフォーマンスが良い。以下の記事が参考になる。

この記事によると++iはi++に比べて一時的な変数を使用しないため動作が早いようだ。

jsでも検証してみた

検証コード↓

const TIMES = 1000000;
let tmp = 0;
function test1() {
    for (let i = 0; i < TIMES ; ++i) {
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;        
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;        
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;        
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;        
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;
        ++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;++tmp;
    }
}

function test2() {
    for (let i = 0; i < TIMES ; ++i) {
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
        tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;tmp++;
    }
}

performance.mark('test1Begin');
test1();
performance.mark('test1End');

performance.mark('test2Begin');
test2();
performance.mark('test2End');

performance.measure(
    'test1',
    'test1Begin',
    'test1End'
);

performance.measure(
    'test2',
    'test2Begin',
    'test2End'
);

console.log(performance.getEntriesByName('test1')[0]);
console.log(performance.getEntriesByName('test2')[0]);

結果

++i: 169ms
i++: 169ms

ほぼ同じだったのでjavascriptでは前置後置のパフォーマンスの違いを意識しなくて良いようだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0