半空洞男女関係

思ったこととかプログラミングしてるときのメモとか色々かいてます。メールはidそのままgmail

気持ちいいけど遅い

    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 ]

ですよねー。そんな違うか。ところで関数型言語はこういうのよしなにやってくれたりしないのだろうか。