<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Canvas drawImage Performance</h1>
    <ul>
      <li><a href="di1.html">drawImage(img,x,y)</a></li>
      <li><a href="di2.html">drawImage(img,x,y,width,height)</a></li>
      <li><a href="di3.html">drawImage(img,sx,sy,swidth,sheight,x,y,width,height)</a></li>
      <li><a href="di4.html">drawImage(img,x,y) + setTransform(a,b,c,d,e,f)</a></li>
      <li><a href="di5.html">All</a></li>
    </ul>
  </body>

</html>
// Code goes here

var type = 0;
var moveElement = document.getElementById('move');
var scaleElement = document.getElementById('scale');
var canvas = document.getElementById('canvasOne');
var ctx = canvas.getContext('2d');

// var size = 10;
var size = 5;
// var rectSize = 62500;
var rectSize = 250000;
var list = [];
var move = 0;
var scale = 1;

for (var x = 0; x < rectSize; x ++) {
  var rectCanvas = document.createElement('canvas');
  var rectCtx = rectCanvas.getContext('2d');
  rectCanvas.width  = size;
  rectCanvas.height = size;
  rectCtx.fillStyle = '#'+Math.round(0xffffff * Math.random()).toString(16);
  rectCtx.fillRect(0, 0, size, size);
  list.push(rectCanvas);
}
  
function init(t) {
  type = t;
  each(t);
}

function each(type) {
  var sTime = Date.now();
  draw(type);
  var timeDiff = Date.now() - sTime;
  document.getElementById('time').textContent = timeDiff;
}

function all() {
  each(1);
  for(var i = 1; i < 5; i++){
    document.getElementById('time' + i).textContent = getAvg(10, i);
  }
}

function getAvg(times, type) {
  var sum = 0
  for(var i = 0; i < times; i++) {
    var sTime = Date.now();
    each(type);
    sum += (Date.now() - sTime);
  }
  return sum/times;
}

function draw(type) {
  var i = 0;
  var inc = size * scale * 2;
  // ctx.fillStyle = '#ffffff';
  // ctx.fillRect(0, 0, 5000, 5000);
  ctx.clearRect(0, 0, 5000, 5000);

  if(type==4){
    ctx.setTransform(scale, 0, 0, scale, move, move);
    inc = size * 2;
  }
  for (var r = 0; r < 5000; r += inc) {
    for (var c = 0; c < 5000; c += inc) {
      var rect = list[i++];
      
      ctx.save();
      drawImg(type, rect, r, c, size);
      ctx.restore();
      
      if(i > list.length) {
        return;
      }
    }
  }
}

function drawImg(type, img, r, c, s) {
  var movedR = r + move;
  var movedC = c + move;
  var scaledS = s * scale;
 
  switch(type) {
    case 1:
      ctx.drawImage(img, movedC, movedR);
      break;
    case 2:
      ctx.drawImage(img, movedC, movedR, scaledS, scaledS);
      break;
    case 3:
      ctx.drawImage(img, 0, 0, size, size, movedC, movedR, scaledS, scaledS);
      break;
    case 4:
      ctx.drawImage(img, c, r);
      break;
  }
}

moveElement.addEventListener('change', function(e) {
  var v = parseInt(e.target.value);
  if (v) {
    move = v;
  }
  
  if(type == 0) {
    all();
  } else {
    each(type);
  }
}, false);

scaleElement.addEventListener('change', function(e) {
  if(type == 1) {
    return;
  }
  
  var v = parseInt(e.target.value);
  if (v) {
    scale = v;
  }
  if(type == 0) {
    all();
  } else {
    each(type);
  }
}, false);

document.getElementById('start').addEventListener('click', function() {
  all();
}, false);
/* Styles go here */

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body onload="init(1)">
    <a href="index.html">home</a>
    <input type="text" id="move" placeholder="move">
    <input type="text" id="scale" placeholder="scale">
    
    <h1>drawImage(img,x,y) - <span id="time"></span></h1>
    
    <canvas id="canvasOne" height="5000px" width="5000px">
    </canvas>
    
    <script src="script.js"></script>
  </body>

</html>
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body onload="init(2)">
    <a href="index.html">home</a>
    <input type="text" id="move" placeholder="move">
    <input type="text" id="scale" placeholder="scale">
    
    <h1>drawImage(img,x,y,width,height) - <span id="time"></span></h1>
    
    <canvas id="canvasOne" height="5000px" width="5000px">
    </canvas>
    
    <script src="script.js"></script>
  </body>

</html>
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body onload="init(3)">
    <a href="index.html">home</a>
    <input type="text" id="move" placeholder="move">
    <input type="text" id="scale" placeholder="scale">
    
    <h1>drawImage(img,sx,sy,swidth,sheight,x,y,width,height) - <span id="time"></span></h1>
    
    <canvas id="canvasOne" height="5000px" width="5000px">
    </canvas>
    
    <script src="script.js"></script>
  </body>

</html>
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body onload="init(4)">
    <a href="index.html">home</a>
    <input type="text" id="move" placeholder="move">
    <input type="text" id="scale" placeholder="scale">
    
    <h1>drawImage(img,x,y) + setTransform(a,b,c,d,e,f) - <span id="time"></span></h1>
    
    <canvas id="canvasOne" height="5000px" width="5000px">
    </canvas>
    
    <script src="script.js"></script>
  </body>

</html>
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body>
    <a href="index.html">home</a>
    <input type="button" id="start" value="start">
    <input type="text" id="move" placeholder="move">
    <input type="text" id="scale" placeholder="scale">
    
    <h1>drawImage Performance - <span id="time"></span></h1>
    <h1>drawImage(img,x,y) - <span id="time1"></span></h1>
    <h1>drawImage(img,x,y,width,height) - <span id="time2"></span></h1>
    <h1>drawImage(img,sx,sy,swidth,sheight,x,y,width,height) - <span id="time3"></span></h1>
    <h1>drawImage(img,x,y) + setTransform(a,b,c,d,e,f) - <span id="time4"></span></h1>
    
    <canvas id="canvasOne" height="5000px" width="5000px">
    </canvas>
    
    <script src="script.js"></script>
  </body>

</html>