为什么硬编码开关在受限的浅表复制中表现更好?

时间:2018-10-24 17:46:11

标签: javascript performance shallow-copy jsperf

我正在研究react自定义渲染器,我必须将react道具浅层复制到后端元素,该元素具有一些保留属性,例如“ key”,“ ref”,“ children”,我应该过滤掉这些属性,尤其是“子级”与元素的“子级”属性冲突,Object.assign无法做到这一点。我不需要复制未知的属性,只需要复制一个受限制的属性即可。

与Object.assign相比,我发现了一些奇怪的东西,在迭代中对switch语句进行硬编码可以在大多数现代浏览器上获得更好的性能,并且我发现与手写代码相比,使用生成的代码可以获得更好的性能(我不确定,它的性能与我的重构代码中的手写代码相同)。

for (var key of Object.keys(source)) {
    switch (key) {
        case 'a': target.a = source.a; break;
        case 'b': target.b = source.b; break;
        // ....
    }
}

我创建了几个测试用例:

https://jsperf.com/copy-known-properties-few

https://jsperf.com/copy-known-properties-many/4

https://jsperf.com/copy-known-properties-polymorphic

第二个例子包括一个额外的构造函数案例。

这里也是重构版本测试,更容易阅读:

https://stackblitz.com/edit/limited-assign-perf

我想知道为什么以及是否可行,或者还有更好的方法。

我的第一个问题,谢谢。

0 个答案:

没有答案