ogsjs-matrix-mult-test

Benchmark created by Cedric Pinson on


Preparation HTML

<script>
  var mat4 = {};
  
  mat4.set = function(mat, dest) {
   dest[0] = mat[0];
   dest[1] = mat[1];
   dest[2] = mat[2];
   dest[3] = mat[3];
   dest[4] = mat[4];
   dest[5] = mat[5];
   dest[6] = mat[6];
   dest[7] = mat[7];
   dest[8] = mat[8];
   dest[9] = mat[9];
   dest[10] = mat[10];
   dest[11] = mat[11];
   dest[12] = mat[12];
   dest[13] = mat[13];
   dest[14] = mat[14];
   dest[15] = mat[15];
   return dest;
  };
  
  mat4.multiply = function(mat, mat2, dest) {
   if (!dest) {
    dest = mat
   }
  
   // Cache the matrix values (makes for huge speed increases!)
   var a00 = mat[0],
       a01 = mat[1],
       a02 = mat[2],
       a03 = mat[3];
   var a10 = mat[4],
       a11 = mat[5],
       a12 = mat[6],
       a13 = mat[7];
   var a20 = mat[8],
       a21 = mat[9],
       a22 = mat[10],
       a23 = mat[11];
   var a30 = mat[12],
       a31 = mat[13],
       a32 = mat[14],
       a33 = mat[15];
  
   var b00 = mat2[0],
       b01 = mat2[1],
       b02 = mat2[2],
       b03 = mat2[3];
   var b10 = mat2[4],
       b11 = mat2[5],
       b12 = mat2[6],
       b13 = mat2[7];
   var b20 = mat2[8],
       b21 = mat2[9],
       b22 = mat2[10],
       b23 = mat2[11];
   var b30 = mat2[12],
       b31 = mat2[13],
       b32 = mat2[14],
       b33 = mat2[15];
  
   dest[0] = b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30;
   dest[1] = b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31;
   dest[2] = b00 * a02 + b01 * a12 + b02 * a22 + b03 * a32;
   dest[3] = b00 * a03 + b01 * a13 + b02 * a23 + b03 * a33;
   dest[4] = b10 * a00 + b11 * a10 + b12 * a20 + b13 * a30;
   dest[5] = b10 * a01 + b11 * a11 + b12 * a21 + b13 * a31;
   dest[6] = b10 * a02 + b11 * a12 + b12 * a22 + b13 * a32;
   dest[7] = b10 * a03 + b11 * a13 + b12 * a23 + b13 * a33;
   dest[8] = b20 * a00 + b21 * a10 + b22 * a20 + b23 * a30;
   dest[9] = b20 * a01 + b21 * a11 + b22 * a21 + b23 * a31;
   dest[10] = b20 * a02 + b21 * a12 + b22 * a22 + b23 * a32;
   dest[11] = b20 * a03 + b21 * a13 + b22 * a23 + b23 * a33;
   dest[12] = b30 * a00 + b31 * a10 + b32 * a20 + b33 * a30;
   dest[13] = b30 * a01 + b31 * a11 + b32 * a21 + b33 * a31;
   dest[14] = b30 * a02 + b31 * a12 + b32 * a22 + b33 * a32;
   dest[15] = b30 * a03 + b31 * a13 + b32 * a23 + b33 * a33;
  
   return dest;
  };
  
  
  var randomMatrix0 = [];
  for (var i = 0, l = 16; i < l; i++) {
   randomMatrix0[i] = Math.random() * 10;
  }
  
  var randomMatrix1 = [];
  for (var i = 0, l = 16; i < l; i++) {
   randomMatrix1[i] = Math.random() * 10;
  }
  
  var glMat1 = [];
  var glMat2 = [];
  mat4.set(randomMatrix0, glMat1);
  mat4.set(randomMatrix1, glMat2);
  
  var osg = {};
  osg.mult = function(a, b, r) {
   var t;
   if (r === a) {
    return osg.Matrix.preMult(a, b);
   } else if (r === b) {
    // post mult
    return osg.Matrix.postMult(a, b);
   }
   if (r === undefined) {
    r = [];
   }
   var s00 = b[0];
   var s01 = b[1];
   var s02 = b[2];
   var s03 = b[3];
   var s10 = b[4];
   var s11 = b[5];
   var s12 = b[6];
   var s13 = b[7];
   var s20 = b[8];
   var s21 = b[9];
   var s22 = b[10];
   var s23 = b[11];
   var s30 = b[12];
   var s31 = b[13];
   var s32 = b[14];
   var s33 = b[15];
  
   var o00 = a[0];
   var o01 = a[1];
   var o02 = a[2];
   var o03 = a[3];
   var o10 = a[4];
   var o11 = a[5];
   var o12 = a[6];
   var o13 = a[7];
   var o20 = a[8];
   var o21 = a[9];
   var o22 = a[10];
   var o23 = a[11];
   var o30 = a[12];
   var o31 = a[13];
   var o32 = a[14];
   var o33 = a[15];
  
   r[0] = s00 * o00 + s01 * o10 + s02 * o20 + s03 * o30;
   r[1] = s00 * o01 + s01 * o11 + s02 * o21 + s03 * o31;
   r[2] = s00 * o02 + s01 * o12 + s02 * o22 + s03 * o32;
   r[3] = s00 * o03 + s01 * o13 + s02 * o23 + s03 * o33;
  
   r[4] = s10 * o00 + s11 * o10 + s12 * o20 + s13 * o30;
   r[5] = s10 * o01 + s11 * o11 + s12 * o21 + s13 * o31;
   r[6] = s10 * o02 + s11 * o12 + s12 * o22 + s13 * o32;
   r[7] = s10 * o03 + s11 * o13 + s12 * o23 + s13 * o33;
  
   r[8] = s20 * o00 + s21 * o10 + s22 * o20 + s23 * o30;
   r[9] = s20 * o01 + s21 * o11 + s22 * o21 + s23 * o31;
   r[10] = s20 * o02 + s21 * o12 + s22 * o22 + s23 * o32;
   r[11] = s20 * o03 + s21 * o13 + s22 * o23 + s23 * o33;
  
   r[12] = s30 * o00 + s31 * o10 + s32 * o20 + s33 * o30;
   r[13] = s30 * o01 + s31 * o11 + s32 * o21 + s33 * o31;
   r[14] = s30 * o02 + s31 * o12 + s32 * o22 + s33 * o32;
   r[15] = s30 * o03 + s31 * o13 + s32 * o23 + s33 * o33;
  
   return r;
  };
  
  osg.mult2 = function(a, b, r) {
   var s00 = b[0];
   var s01 = b[1];
   var s02 = b[2];
   var s03 = b[3];
   var s10 = b[4];
   var s11 = b[5];
   var s12 = b[6];
   var s13 = b[7];
   var s20 = b[8];
   var s21 = b[9];
   var s22 = b[10];
   var s23 = b[11];
   var s30 = b[12];
   var s31 = b[13];
   var s32 = b[14];
   var s33 = b[15];
  
   var o00 = a[0];
   var o01 = a[1];
   var o02 = a[2];
   var o03 = a[3];
   var o10 = a[4];
   var o11 = a[5];
   var o12 = a[6];
   var o13 = a[7];
   var o20 = a[8];
   var o21 = a[9];
   var o22 = a[10];
   var o23 = a[11];
   var o30 = a[12];
   var o31 = a[13];
   var o32 = a[14];
   var o33 = a[15];
  
   r[0] = s00 * o00 + s01 * o10 + s02 * o20 + s03 * o30;
   r[1] = s00 * o01 + s01 * o11 + s02 * o21 + s03 * o31;
   r[2] = s00 * o02 + s01 * o12 + s02 * o22 + s03 * o32;
   r[3] = s00 * o03 + s01 * o13 + s02 * o23 + s03 * o33;
  
   r[4] = s10 * o00 + s11 * o10 + s12 * o20 + s13 * o30;
   r[5] = s10 * o01 + s11 * o11 + s12 * o21 + s13 * o31;
   r[6] = s10 * o02 + s11 * o12 + s12 * o22 + s13 * o32;
   r[7] = s10 * o03 + s11 * o13 + s12 * o23 + s13 * o33;
  
   r[8] = s20 * o00 + s21 * o10 + s22 * o20 + s23 * o30;
   r[9] = s20 * o01 + s21 * o11 + s22 * o21 + s23 * o31;
   r[10] = s20 * o02 + s21 * o12 + s22 * o22 + s23 * o32;
   r[11] = s20 * o03 + s21 * o13 + s22 * o23 + s23 * o33;
  
   r[12] = s30 * o00 + s31 * o10 + s32 * o20 + s33 * o30;
   r[13] = s30 * o01 + s31 * o11 + s32 * o21 + s33 * o31;
   r[14] = s30 * o02 + s31 * o12 + s32 * o22 + s33 * o32;
   r[15] = s30 * o03 + s31 * o13 + s32 * o23 + s33 * o33;
  
   return r;
  };
  
  var result = [];
  
  var m0 = new Float32Array(randomMatrix0);
  var m1 = new Float32Array(randomMatrix1);
  var r = new Float32Array(randomMatrix1);
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
glMatrix
mat4.multiply(glMat1, glMat2, result);
ready
ogjs-mult
osg.mult(randomMatrix0, randomMatrix1, result);
ready
ogjs-mult-no test
osg.mult2(randomMatrix0, randomMatrix1, result);
ready
ogjs-mult-no test with float 32
osg.mult2(m0, m1, r);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 1: published by Cedric Pinson on