JavaScriptにおける循環操作の最適化
軽い操作であっても、ループ内で何度も繰り返されると多くのリソースを消費する可能性があります。
例を見てみましょう。 ある配列が与えられているとします:
let arr = [1, 2, 3, 4, 5, 6];
この配列要素の平均値を求めてみましょう。 そのためには、要素の合計を求め、それを要素数で割る必要があります。 あるプログラマーがこの問題を次のように解決したとします:
let avg = 0;
for (let elem of arr) {
avg += elem / arr.length;
}
console.log(avg);
この解決策の問題点を考えてみましょう。 技術的にはコードは正しく動作し、正しい答えを返します。 数学的には、合計全体を数で割ることも、各加数を数で割ることも正しいからです。
しかし、別の問題が生じます。 問題は、配列内の要素の数だけ除算を実行する点です。 結果として、不要な操作を大量に行うことになります。 なぜなら、除算は最後に1回だけ、見つかった合計全体を割るようにすれば済むからです。
コードを最適化してみましょう:
let sum = 0;
for (let elem of arr) {
sum += elem;
}
let avg = sum / arr.length;
console.log(avg);
次のコードを最適化してください:
for (let i = 1900; i <= 2100; i++) {
let curr = new Date;
let date = new Date(i, curr.getMonth(), curr.getDate());
if (curr.getDay() === date.getDay()) {
console.log(date);
}
}
次のコードを最適化してください:
let obj = {a: 10, b: 20, c: 30, d: 40, e: 50};
let sum = 0;
for (let key in obj) {
if (String(obj[key])[0] === '1' || String(obj[key])[0] === '2') {
sum += obj[key];
}
}
console.log(sum);