| // Copyright 2014 The Closure Library Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS-IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| /** |
| * @fileoverview Performance test for different implementations of |
| * byteArrayToString. |
| */ |
| |
| |
| goog.provide('goog.crypt.byteArrayToStringPerf'); |
| |
| goog.require('goog.array'); |
| goog.require('goog.dom'); |
| goog.require('goog.testing.PerformanceTable'); |
| |
| goog.setTestOnly('goog.crypt.byteArrayToStringPerf'); |
| |
| |
| var table = new goog.testing.PerformanceTable( |
| goog.dom.getElement('perfTable')); |
| |
| |
| var BYTES_LENGTH = Math.pow(2, 20); |
| var CHUNK_SIZE = 8192; |
| |
| function getBytes() { |
| var bytes = []; |
| for (var i = 0; i < BYTES_LENGTH; i++) { |
| bytes.push('A'.charCodeAt(0)); |
| } |
| return bytes; |
| } |
| |
| function copyAndSpliceByteArray(bytes) { |
| |
| // Copy the passed byte array since we're going to destroy it. |
| var remainingBytes = goog.array.clone(bytes); |
| var strings = []; |
| |
| // Convert each chunk to a string. |
| while (remainingBytes.length) { |
| var chunk = goog.array.splice(remainingBytes, 0, CHUNK_SIZE); |
| strings.push(String.fromCharCode.apply(null, chunk)); |
| } |
| return strings.join(''); |
| } |
| |
| function sliceByteArrayConcat(bytes) { |
| var str = ''; |
| for (var i = 0; i < bytes.length; i += CHUNK_SIZE) { |
| var chunk = goog.array.slice(bytes, i, i + CHUNK_SIZE); |
| str += String.fromCharCode.apply(null, chunk); |
| } |
| return str; |
| } |
| |
| |
| function sliceByteArrayJoin(bytes) { |
| var strings = []; |
| for (var i = 0; i < bytes.length; i += CHUNK_SIZE) { |
| var chunk = goog.array.slice(bytes, i, i + CHUNK_SIZE); |
| strings.push(String.fromCharCode.apply(null, chunk)); |
| } |
| return strings.join(''); |
| } |
| |
| function mapByteArray(bytes) { |
| var strings = goog.array.map(bytes, String.fromCharCode); |
| return strings.join(''); |
| } |
| |
| function forLoopByteArrayConcat(bytes) { |
| var str = ''; |
| for (var i = 0; i < bytes.length; i++) { |
| str += String.fromCharCode(bytes[i]); |
| } |
| return str; |
| } |
| |
| function forLoopByteArrayJoin(bytes) { |
| var strs = []; |
| for (var i = 0; i < bytes.length; i++) { |
| strs.push(String.fromCharCode(bytes[i])); |
| } |
| return strs.join(''); |
| } |
| |
| |
| function run() { |
| var bytes = getBytes(); |
| table.run(goog.partial(copyAndSpliceByteArray, getBytes()), |
| 'Copy array and splice out chunks.'); |
| |
| table.run(goog.partial(sliceByteArrayConcat, getBytes()), |
| 'Slice out copies of the byte array, concatenating results'); |
| |
| table.run(goog.partial(sliceByteArrayJoin, getBytes()), |
| 'Slice out copies of the byte array, joining results'); |
| |
| table.run(goog.partial(forLoopByteArrayConcat, getBytes()), |
| 'Use for loop with concat.'); |
| |
| table.run(goog.partial(forLoopByteArrayJoin, getBytes()), |
| 'Use for loop with join.'); |
| |
| // Purposefully commented out. This ends up being tremendously expensive. |
| // table.run(goog.partial(mapByteArray, getBytes()), |
| // 'Use goog.array.map and fromCharCode.'); |
| |
| } |
| |
| run(); |
| |