Script Preparation code:
x
 
var N = 1000
const dim = {
    width: 1024,
    height: 768
}
var ctxs = []
const SZ = 4
const SZ2 = 2 * SZ
const TWO_PI = 2 * Math.PI
for (let i = 0; i < 6; i++) {
    const canvas = document.createElement("canvas")
    Object.assign(canvas, dim)
    ctxs.push(canvas.getContext("2d"))
}
function randXY() {
    const x = dim.width * Math.random()|0
    const y = dim.height * Math.random()|0
    return [x, y]
}
/*
 * Square stuff
 */
function drawSquare() {
    ctxs[0].rect(...randXY(), SZ2, SZ2)
}
const buffer = document.createElement("canvas")
buffer.width = SZ2
buffer.height = 2 * SZ2
const bufferCtx = buffer.getContext("2d")
bufferCtx.fillRect(0, 0, SZ2, SZ2)
function drawImageSquare() {
    ctxs[1].drawImage(buffer, 0, 0, SZ2, SZ2, ...randXY(), SZ2, SZ2)
}
const imageDataSquare = bufferCtx.getImageData(0, 0, SZ2, SZ2)
function putImageDataSquare() {
    ctxs[2].putImageData(imageDataSquare, ...randXY())
}
/*
 * Circle stuff
 */
function drawCircle() {
    const ctx = ctxs[3]
    ctx.arc(...randXY(), SZ, 0, TWO_PI)
    ctx.closePath()
}
// draw a circle onto the buffer, below the square
bufferCtx.beginPath()
bufferCtx.arc(SZ2, 1.5*SZ2, SZ, 0, TWO_PI)
bufferCtx.closePath()
bufferCtx.fill()
function drawImageCircle() {
    ctxs[4].drawImage(buffer, 0, SZ2, SZ2, SZ2, ...randXY(), SZ2, SZ2)
}
const imageDataCircle = bufferCtx.getImageData(0, SZ2, SZ2, SZ2)
function putImageDataCircle() {
    ctxs[5].putImageData(imageDataCircle, ...randXY())
}
function doMany(func) {
    for (let i = 0; i < N; i++) {
        func()
    }
}
Tests:
  • draw squares

     
    ctxs[0].beginPath()
    doMany(drawSquare)
    ctxs[0].fill()
  • draw circles

     
    ctxs[1].beginPath()
    doMany(drawCircle)
    ctxs[1].fill()
  • drawImage squares

     
    doMany(drawImageSquare)
  • drawImage circles

     
    doMany(drawImageCircle)
  • putImageData squares

     
    doMany(putImageDataSquare)
  • putImageData circles

     
    doMany(putImageDataCircle)
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    draw squares
    draw circles
    drawImage squares
    drawImage circles
    putImageData squares
    putImageData circles

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 3 years ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.58
Opera 82 on Windows
View result in a separate tab
Test name Executions per second
draw squares 554.2 Ops/sec
draw circles 300.6 Ops/sec
drawImage squares 78.9 Ops/sec
drawImage circles 84.1 Ops/sec
putImageData squares 4.2 Ops/sec
putImageData circles 5.8 Ops/sec