この記事は株式会社シンプルウェイ Advent Calendar 2025の2日目の記事です。
昨日に続き、普段のプログラミングで意識しておきたいパフォーマンスを考慮したコーディングを紹介したいと思います。
※ 今回の記事はベンチマーク等で検証していません。
プログラムは最終的にはCPUで実行されるわけですから、必ず機械語に翻訳されているはずです。
プログラムを書くときにどのような機械語へ翻訳されるかを意識すると、効率が良いプログラムがかけるのではないかと思います。
0と比較する
x86やARMには変数をゼロと比較する命令セットがあります。なので、プログラムを書くときもゼロと比較できるようであれば、そのように書いたほうが効率よくなることが予想されます。
例えば、変数がBooleanとして使われていて、0か1しか入らないなら、1と比較するよりも0と比較したほうが速くなるでしょう。
var a = 1;
if (a === 1) {
// a is true
} else {
// a is false
}
よりも
var a = 1;
if (a === 0) {
// a is false
} else {
// a is true
}
のほうが速くなる可能性があります。
ただし、比較を 0 と行うという最適化は有効なのか ?を見ると1命令しか変わらないようなので、本当に微々たる差でしょう。
先の例だと、Falseの場合の処理スコープが先に記述されてしまうので、構造的に読みにくいプログラムになってしまいそうです。可読性を考慮して使う場所を考えたほうが良さそうです。
インクリメント・デクリメントを使う
命令セットにはインクリメント・デクリメントの命令があります。単純に1加算/減算する場合は、言語に実装されているインクリメント・デクリメント演算子を使ったほうが速くなる可能性があります。
var a = 0;
a = a + 1;
よりも
var a = 0;
a++;
のほうが速くなる可能性があります。
まぁ前者のような書き方はあまりしないと思いますが、例えば偶数の数列を作りたいときに
var a = [];
for (var i = 0; i < 100 * 2; i += 2) {
a.push(i);
}
よりも
var a = [];
for (var i = 0; i < 100; i++) {
a.push(i << 1);
}
なんて書いたほうが速くなるのではないかなと思います。