| <!-- | |
| Copyright 2013, Google Inc. | |
| All rights reserved. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions are | |
| met: | |
| * Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| * Redistributions in binary form must reproduce the above | |
| copyright notice, this list of conditions and the following disclaimer | |
| in the documentation and/or other materials provided with the | |
| distribution. | |
| * Neither the name of Google Inc. nor the names of its | |
| contributors may be used to endorse or promote products derived from | |
| this software without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| --> | |
| <html> | |
| <head> | |
| <title>ArrayBuffer benchmark</title> | |
| <script src="util.js"></script> | |
| <script> | |
| var PRINT_SIZE = true; | |
| // Initial size of arrays. | |
| var START_SIZE = 10 * 1024; | |
| // Stops benchmark when the size of an array exceeds this threshold. | |
| var STOP_THRESHOLD = 100000 * 1024; | |
| // If the size of each array is small, write/read the array multiple times | |
| // until the sum of sizes reaches this threshold. | |
| var MIN_TOTAL = 100000 * 1024; | |
| var MULTIPLIERS = [5, 2]; | |
| // Repeat benchmark for several times to measure performance of optimized | |
| // (such as JIT) run. | |
| var REPEAT_FOR_WARMUP = 3; | |
| function writeBenchmark(size, minTotal) { | |
| var totalSize = 0; | |
| while (totalSize < minTotal) { | |
| var arrayBuffer = new ArrayBuffer(size); | |
| // Write 'a's. | |
| fillArrayBuffer(arrayBuffer, 0x61); | |
| totalSize += size; | |
| } | |
| return totalSize; | |
| } | |
| function readBenchmark(size, minTotal) { | |
| var totalSize = 0; | |
| while (totalSize < minTotal) { | |
| var arrayBuffer = new ArrayBuffer(size); | |
| if (!verifyArrayBuffer(arrayBuffer, 0x00)) { | |
| queueLog('Verification failed'); | |
| return -1; | |
| } | |
| totalSize += size; | |
| } | |
| return totalSize; | |
| } | |
| function runBenchmark(benchmarkFunction, | |
| size, | |
| stopThreshold, | |
| minTotal, | |
| multipliers, | |
| multiplierIndex) { | |
| while (size <= stopThreshold) { | |
| var maxSpeed = 0; | |
| for (var i = 0; i < REPEAT_FOR_WARMUP; ++i) { | |
| var startTimeInMs = getTimeStamp(); | |
| var totalSize = benchmarkFunction(size, minTotal); | |
| maxSpeed = Math.max(maxSpeed, | |
| calculateSpeedInKB(totalSize, startTimeInMs)); | |
| } | |
| queueLog(formatResultInKiB(size, maxSpeed, PRINT_SIZE)); | |
| size *= multipliers[multiplierIndex]; | |
| multiplierIndex = (multiplierIndex + 1) % multipliers.length; | |
| } | |
| } | |
| function runBenchmarks() { | |
| queueLog('Message size in KiB, Speed in kB/s'); | |
| queueLog('Write benchmark'); | |
| runBenchmark( | |
| writeBenchmark, START_SIZE, STOP_THRESHOLD, MIN_TOTAL, MULTIPLIERS, 0); | |
| queueLog('Finished'); | |
| queueLog('Read benchmark'); | |
| runBenchmark( | |
| readBenchmark, START_SIZE, STOP_THRESHOLD, MIN_TOTAL, MULTIPLIERS, 0); | |
| addToLog('Finished'); | |
| } | |
| function init() { | |
| logBox = document.getElementById('log'); | |
| queueLog(window.navigator.userAgent.toLowerCase()); | |
| addToLog('Started...'); | |
| setTimeout(runBenchmarks, 0); | |
| } | |
| </script> | |
| </head> | |
| <body onload="init()"> | |
| <textarea | |
| id="log" rows="50" style="width: 100%" readonly></textarea> | |
| </body> | |
| </html> |