Javascript 为什么2参数drawImage比9参数快?

Javascript 为什么2参数drawImage比9参数快?,javascript,html,html5-canvas,Javascript,Html,Html5 Canvas,我发现,如果我将一个HTML5画布绘制到另一个,如果我使用2参数版本的drawImage(),其中我只提供目标x和y坐标,这比使用9参数版本(其中我指定了源和目标偏移量和边界)要快得多。即使后者中指定的边界与前者中源画布的大小相同,也是如此 我在Chrome上看到了这个 下面是一个JSFIDLE演示我所看到的: var cycleResults=document.getElementById('cycleResults'); var result=document.getElementById

我发现,如果我将一个HTML5画布绘制到另一个,如果我使用2参数版本的drawImage(),其中我只提供目标x和y坐标,这比使用9参数版本(其中我指定了源和目标偏移量和边界)要快得多。即使后者中指定的边界与前者中源画布的大小相同,也是如此

我在Chrome上看到了这个

下面是一个JSFIDLE演示我所看到的:

var cycleResults=document.getElementById('cycleResults');
var result=document.getElementById('result');
var btn=document.getElementById('btn');
var canvas=$('.c')[0],
context=canvas.getContext(“2d”),
scratchCanvas=document.createElement('canvas'),
scratchContext=scratchCanvas.getContext(“2d”),
scratchCanvas2=document.createElement('canvas'),
scratchContext2=scratchCanvas2.getContext(“2d”);
context.fillStyle='red';
fillRect(0,0,25,25);
context.fillStyle='white';
scratchCanvas.setAttribute('width',25);
scratchCanvas.setAttribute('height',25);
scratchCanvas.style.width='25px';
scratchCanvas.style.height='25px';
scratchContext.fillStyle='white';
scratchContext.fillText('F',12,12);
scratchCanvas2.setAttribute('width',8);
scratchCanvas2.setAttribute('height',8);
scratchCanvas2.style.width='8px';
scratchCanvas2.style.height='8px';
scratchContext2.fillStyle='white';
scratchContext2.fillText('F',0,8);
函数test1()
{
背景。drawImage(scratchCanvas2、12、4);
}
函数test2()
{
drawImage(scratchCanvas,12,4,8,8,12,4,8,8);
}
函数test3()
{
上下文。填充文本('F',12,12);
}
//基准====================
btn.onclick=函数runTests(){
btn.setAttribute('disable',true);
cycleResults.innerHTML='';
result.textContent='Tests running…';
var-suite=新的Benchmark.suite;
//添加测试
一套
.add('test1',test1)
.add('test2',test2)
.add('test3',test3)
//添加侦听器
.on('循环',功能(事件){
var result=document.createElement('li');
result.textContent=String(event.target);
document.getElementById('cycleResults'))
.儿童(结果);
})
.on('complete',function(){
result.textContent='faster is'+this.filter('faster').pull('name');
btn.setAttribute('disable',false);
})
//异步运行
.run({'async':true});
};


运行测试
2-param版本最终调用相同的9-param版本,两个测试之间的性能差异在于,在2-param版本中,我们绘制了整个源图像,而在另一个版本中,我们仅绘制了部分源图像。前一种情况更有可能受益于将所有像素存储在RAM中的连续字节中,这将有助于防止一级缓存未命中

2-param版本最终调用相同的9-param版本,两个测试之间的性能差异在于,在2-param版本中,我们绘制了整个源图像,而在另一个版本中,我们仅绘制了部分源图像。前一种情况更有可能受益于将所有像素存储在RAM中的连续字节中,这将有助于防止一级缓存未命中

我无法给出详细的原因,但一般情况下,任何函数使用的参数越多,调用所需的时间就越长。我还怀疑GPU片段/顶点着色器设置中涉及额外的开销。虽然我在Chrome上发现将图像转换为画布比使用标准图像在drawImage上有更好的性能。FF目前在图形和脚本速度方面最好的版本似乎并不太关心图像源或参数长度。@Blindman67在mac上的Firefox 50上,2参数版本的drawImage速度是9参数版本的两倍,至少在上面的测试中是这样。在Win10 Firefox 51.0b3上,只有0.2µs(2/1000000秒)使用我自己的基准测试时,参数版本介于2和9之间。使用您的,差异是3µscorrection(2/1000000秒)应该是(0.2/1000000秒)。2-param版本最终调用相同的9-param版本,两个测试之间的性能差异是,在2-param版本中,我们绘制了整个源图像,而在另一个版本中,我们仅绘制了部分源图像。前一种情况更可能受益于将所有像素存储在RAM中的连续字节中,这将有助于防止一级缓存未命中。我无法给出详细的原因,但一般情况下,任何函数使用的参数越多,调用所需的时间就越长。我还怀疑GPU片段/顶点着色器设置中涉及额外的开销。虽然我在Chrome上发现将图像转换为画布比使用标准图像在drawImage上有更好的性能。FF目前在图形和脚本速度方面最好的版本似乎并不太关心图像源或参数长度。@Blindman67在mac上的Firefox 50上,2参数版本的drawImage速度是9参数版本的两倍,至少在上面的测试中是这样。在Win10 Firefox 51.0b3上,只有0.2µs(2/1000000秒)使用我自己的基准测试时,参数版本介于2和9之间。使用您的,差异是3µscorrection(2/1000000秒)应该是(0.2/1000000秒)。2-param版本最终调用相同的9-param版本,两个测试之间的性能差异是,在2-param版本中,我们绘制了整个源图像,而在另一个版本中,我们仅绘制了部分源图像。前一种情况更有可能受益于将所有像素存储在RAM中的连续字节中,这将有助于防止一级缓存未命中。