Update ReadMe.md
[qtwebkit.git] / JSTests / microbenchmarks / Float32Array-matrix-mult.js
blobca486dabf5cbe97a69e09e47acd3f4563c8608ca
1 function makeEmptyMatrix(rows, columns)
3     var result = new Array(rows);
4     for (var i = 0; i < rows; ++i)
5         result[i] = new Float32Array(columns);
6     result.rows = rows;
7     result.columns = columns;
8     return result;
11 function multiplyMatrices(left, right)
13     if (left.columns != right.rows) {
14         throw new Error(
15             "Left matrix has " + left.columns + " columns while right matrix has " +
16                 right.rows + " rows.");
17     }
18     
19     var result = makeEmptyMatrix(left.rows, right.columns);
20     
21     for (var row = 0; row < result.rows; ++row) {
22         for (var column = 0; column < result.columns; ++column) {
23             for (var i = 0; i < left.columns; ++i)
24                 result[row][column] += left[row][i] * right[i][column];
25         }
26     }
27     
28     return result;
31 function checkMatricesEqual(left, right)
33     if (left.columns != right.columns) {
34         throw new Error(
35             "Left matrix has " + left.columns + " columns while right matrix has " +
36                 right.columns + " columns");
37     }
38     if (left.rows != right.rows) {
39         throw new Error(
40             "Left matrix has " + left.rows + " rows while right matrix has " +
41                 right.rows + " rows");
42     }
43     
44     for (var row = 0; row < left.rows; ++row) {
45         for (var column = 0; column < left.columns; ++column) {
46             if (left[row][column] != right[row][column]) {
47                 throw new Error(
48                     "left[" + row + "][" + column + "] = " + left[row][column] +
49                         " while right[" + row + "][" + column + "] = " + right[row][column]);
50             }
51         }
52     }
55 function parseMatrix(string)
57     var columns = null;
58     var result = [];
59     string.split("\\").forEach(function(string){
60         var row = [];
61         string.split(" ").forEach(function(string){
62             if (string.match(/^ *$/))
63                 return;
64             row.push(parseFloat(string));
65         });
66         if (columns) {
67             if (columns != row.length) {
68                 throw new Error(
69                     "Not all rows have the same number of columns. First row has " +
70                         columns + " columns, while column #" + (result.length + 1) + " has " +
71                         row.length + " columns.");
72             }
73         } else
74             columns = row.length;
75         var typedRow = new Float32Array(row.length);
76         for (var i = 0; i < columns; ++i)
77             typedRow[i] = row[i];
78         result.push(typedRow);
79     });
80     result.rows = result.length;
81     result.columns = columns;
82     return result;
85 function printMatrix(matrix)
87     var maxCellSize = 0;
88     
89     for (var row = 0; row < matrix.rows; ++row) {
90         for (var column = 0; column < matrix.columns; ++column)
91             maxCellSize = Math.max(maxCellSize, ("" + matrix[row][column]).length);
92     }
93     
94     function pad(value)
95     {
96         var result = "" + value;
97         while (result.length < maxCellSize)
98             result = " " + result;
99         return result;
100     }
101     
102     for (var row = 0; row < matrix.rows; ++row) {
103         var rowText = "";
104         for (var column = 0; column < matrix.columns; ++column) {
105             if (column)
106                 rowText += " ";
107             rowText += pad(matrix[row][column]);
108         }
109         print(rowText);
110     }
113 var left = parseMatrix("1 2 3 4 5 \\ 6 7 8 9 10 \\ 21 22 23 24 25 \\ 26 27 28 29 30");
114 var right = parseMatrix("11 12 31 32 \\ 13 14 33 34 \\ 15 16 35 36 \\ 17 18 37 38 \\ 19 20 39 40");
115 var expectedResult = parseMatrix("245 260 545 560 \\ 620 660 1420 1460 \\ 1745 1860 4045 4160 \\ 2120 2260 4920 5060");
117 for (var i = 0; i < 3000; ++i)
118     checkMatricesEqual(multiplyMatrices(left, right), expectedResult);