gpt4 book ai didi

javascript - V8引擎巫毒: Why is this faster/slower?

转载 作者:数据小太阳 更新时间:2023-10-29 04:46:22 27 4
gpt4 key购买 nike

我目前正在研究图像编辑器,偶然发现了 V8 中有关像素操作和/或函数调用的奇怪行为。

http://jsperf.com/canvas-pixelwise-manipulation-performance

有两个测试用例。两个测试用例都应该操纵内存 Canvas 的图像数据以增加亮度。因此他们必须遍历每个像素并操纵每个像素的 4 个颜色值。

案例一

案例 1 “总共调用了 1 个函数”,这意味着它将上下文和 imageData 传递给一个函数,然后该函数遍历像素并处理数据。一站式功能

案例2

案例 2 执行“每个像素 1 次函数调用”,这意味着它遍历像素并为每个像素调用一个方法,然后操作给定像素的 imageData。这导致(在本例中)250000 次额外的函数调用。

我的期望

我预计案例 1 比案例 2 快得多,因为案例 2 进行了 250000 次额外的函数调用。

结果

在 Chrome 中,情况正好相反。如果我进行 250000 次额外的函数调用,它比处理所有图像操作的单个函数调用要快。

我的问题:为什么?

最佳答案

这两种代码都不会操纵任何 Canvas ,并且在基准循环中定义函数也没有任何意义。你想要的是永远不会重新创建的静态函数,这样一旦 JIT 优化了它们,它们就会保持优化状态。你不想要测量函数开销的创建,因为真实的应用程序只会定义函数一次。

修复基准代码后,它们应该以相同的速度运行,因为 manipulatePixel 函数将获得内联。

http://jsperf.com/canvas-pixelwise-manipulation-performance/4

enter image description here

我还创建了另一个 jsperf,我在其中有目的地操纵 V8 启发式* 而不是内联 manipulatePixel功能:

http://jsperf.com/canvas-pixelwise-manipulation-performance/5

enter image description here

如您所见,它现在慢了 50%。 2 个 jsperfs 之间的唯一区别是 manipulatePixel 函数中的巨大注释。


*V8 查看raw textual size of the function (包括评论)作为内联决策的启发式。

关于javascript - V8引擎巫毒: Why is this faster/slower?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17343794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com