Sas*_*ich 7 javascript performance v8
我目前正在研究图像编辑器,并在V8中偶然发现了关于像素操作和/或函数调用的奇怪行为.
http://jsperf.com/canvas-pixelwise-manipulation-performance
有两个测试用例.两个测试用例都应该操作内存中画布的图像数据以增加亮度.因此,他们必须迭代每个像素并操纵每个像素的4个颜色值.
情况1执行"总共1个函数调用",这意味着它将上下文和imageData传递给函数,然后迭代像素并操纵数据.一体化功能
情况2执行" 每个像素 1次函数调用",这意味着它迭代像素并为每个像素调用一个方法,然后操纵给定像素的imageData.这导致(在这种情况下)250000个额外的函数调用.
我希望案例1比案例2快得多,因为案例2正在进行250000个额外的函数调用.
在Chrome中,它恰恰相反.如果我执行250000个额外的函数调用,它比处理所有图像处理的单个函数调用更快.
这两个代码都不会操作任何画布,并且在基准循环内定义函数实际上没有意义。您想要的是永远不会重新创建的静态函数,这样一旦 JIT 优化了它们,它们就会保持优化状态。您不想测量函数创建的开销,因为真正的应用程序只会定义该函数一次。
一旦修复了基准代码,它们应该以相同的速度运行,因为函数manipulatePixel
将被内联。
http://jsperf.com/canvas-pixelwise-manipulation-performance/4
我还创建了另一个 jsperf,其中我有目的地操纵 V8 启发式*而不是内联函数manipulatePixel
:
http://jsperf.com/canvas-pixelwise-manipulation-performance/5
如您所见,现在速度慢了 50%。2 个 jsperfs 之间的唯一区别是函数中的巨大注释manipulatePixel
。
*V8 将函数的原始文本大小(包括注释)视为内联决策的启发式。
归档时间: |
|
查看次数: |
353 次 |
最近记录: |