Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么大多数JavaScript本机函数都比它们的原始实现慢?_Javascript_Function_Optimization - Fatal编程技术网

为什么大多数JavaScript本机函数都比它们的原始实现慢?

为什么大多数JavaScript本机函数都比它们的原始实现慢?,javascript,function,optimization,Javascript,Function,Optimization,不过我注意到,本机JavaScript函数通常比简单实现慢得多。这背后的原因是什么?看了之后。似乎本地实现在错误处理和特性方面比简单的自我实现做得更多 例如,查看MDN上map的polyfill实现。它基于ECMA-262中指定的相同算法。现在,更新示例以使用此算法可以使本机实现更快,尽管只是稍微加快: 另外,map可能不是最好的测试示例,因为它在本机代码和提供的lambda函数之间来回跳转 我本来希望本机的concat函数有更好的性能。然而,看看ECMA-262,我们可以看到它也只是做得更多。

不过我注意到,本机JavaScript函数通常比简单实现慢得多。这背后的原因是什么?

看了之后。似乎本地实现在错误处理和特性方面比简单的自我实现做得更多

例如,查看MDN上
map
的polyfill实现。它基于ECMA-262中指定的相同算法。现在,更新示例以使用此算法可以使本机实现更快,尽管只是稍微加快:

另外,
map
可能不是最好的测试示例,因为它在本机代码和提供的lambda函数之间来回跳转

我本来希望本机的
concat
函数有更好的性能。然而,看看ECMA-262,我们可以看到它也只是做得更多。查看第15.4.4.4节中的算法,我们可以看到它处理了一些额外的情况。例如,组合多个参数,有些是数组,有些是其他类型:

[1,2,3].concat([4,5,6],“7,8,9,10])

返回

[1,2,3,4,5,6,“七”,8,9,10]


最后,需要注意的是,这些都是非常基本的算法。当在巨大的数据集上运行这样的算法时,或者连续运行数千次时,一个算法似乎比另一个算法快得多。然而,即使在数千次迭代中执行几次额外的安全检查,也会使一个算法比不执行这些检查的算法慢得多。计算计算操作如果您额外的错误处理和功能使循环中的代码行数加倍,那么速度自然会变慢。

可能是因为它必须在执行代码之前建立上下文。在我的例子(FF26)中,在
concat native vs implemented
中,本机比实现快。总之,有趣的一点。我从来没有想过这一点,并认为本机总是更好。只是在我的FF27上测试了它,对我来说,本机代码也更快。@Viclib,你对我的答案不满意吗?:)要使您的地图在Chrome中的运行速度提高一倍左右,只需说出阵列需要多大:。也许这并不适用于所有长度的数组,但仍然很有趣。如果查看jsPref结果,在大多数情况下,实现仍然比本机方法快,因此可能这不是原因:P@Derek朕會功夫 嗨,德里克,谢谢你的检查。似乎根据ECMA-262,算法应该使用
Object.defineProperty
,但是我从MDN使用的polyfill有一条评论说,出于兼容性原因,它没有使用。在将JSPerf示例更新为使用
Object.defineProperty
之后,它现在的速度明显变慢了。:)另一个jsPerf链接已经尘埃落定:(