members.filter(e => { return e.id !== targetId }).forEach(e => { e.yo(); });
こんな感じのコード書いてて、これって冷静に考えると2回回ってるなと思い、
members.forEach(e => { if(e.id !== targetId) { e.yo(); } })
こう書きなおした。前のほうが気持ちいいけど、たぶんこっちの方が早い。どれくらい違うのか試してみた。
テストコード
const DATA_MAX = 100000; const TRY_COUNT = 10 // create data set let members = []; for (let i = 0; i < DATA_MAX; i++) { members.push({ id: Date.now() + Math.random(), yo: Date.now }) } const targetId = members[0].id; // 10 times let A = []; let B = []; for (let i = 0; i < TRY_COUNT; i++) { let t0 = Date.now(); members.filter(e => { return e.id !== targetId }).forEach(e => { e.yo(); }); let t1 = Date.now(); let t2 = Date.now(); members.forEach(e => { if(e.id !== targetId) { e.yo(); } }) let t3 = Date.now(); A.push(t1 - t0); B.push(t3 - t2); } console.log("A: ", A.reduce((p, c) => { return p + c }) / A.length, A) console.log("B: ", B.reduce((p, c) => { return p + c }) / B.length, B)
結果
A: 77.7 [ 90, 87, 77, 74, 76, 77, 74, 77, 71, 74 ] B: 10.9 [ 14, 12, 10, 9, 11, 11, 10, 11, 12, 9 ]
ですよねー。そんな違うか。ところで関数型言語はこういうのよしなにやってくれたりしないのだろうか。