// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. new BenchmarkSuite('DataViewTest-DataView-BigEndian', [1000], [ new Benchmark('DataViewTest-DataView-BigEndian', false, false, 0, doTestDataViewBigEndian), ]); new BenchmarkSuite('DataViewTest-DataView-LittleEndian', [1000], [ new Benchmark('DataViewTest-DataView-LittleEndian', false, false, 0, doTestDataViewLittleEndian), ]); new BenchmarkSuite('DataViewTest-DataView-Floats', [1000], [ new Benchmark('DataViewTest-DataView-Floats', false, false, 0, doTestDataViewFloats), ]); new BenchmarkSuite('DataViewTest-TypedArray-BigEndian', [1000], [ new Benchmark('DataViewTest-TypedArray-BigEndian', false, false, 0, doTestTypedArrayBigEndian), ]); new BenchmarkSuite('DataViewTest-TypedArray-LittleEndian', [1000], [ new Benchmark('DataViewTest-TypedArray-LittleEndian', false, false, 0, doTestTypedArrayLittleEndian), ]); new BenchmarkSuite('DataViewTest-TypedArray-Floats', [1000], [ new Benchmark('DataViewTest-TypedArray-Floats', false, false, 0, doTestTypedArrayFloats), ]); function doTestDataViewBigEndian() { doIterations(false, true); } function doTestDataViewLittleEndian() { doIterations(true, true); } function doTestTypedArrayBigEndian() { doIterations(false, false); } function doTestTypedArrayLittleEndian() { doIterations(true, false); } function doTestDataViewFloats() { doFloatIterations(true); } function doTestTypedArrayFloats() { doFloatIterations(false); } function doIterations(littleEndian, dataView) { var buffer = makeBuffer(1000, littleEndian); var iterations = 10; if (dataView) { for (var i = 0; i < iterations; i++) doOneIterationDV(buffer, littleEndian); } else { for (var i = 0; i < iterations; i++) doOneIterationJS(buffer, littleEndian); } } function makeBuffer(size, littleEndian) { var buffer = new ArrayBuffer(size * 14); var view = new DataView(buffer); for (var i = 0; i < size; ++i) { view.setInt8(i * 14, i); view.setUint8(i * 14 + 1, i); view.setInt16(i * 14 + 2, i * i, littleEndian); view.setUint16(i * 14 + 4, i * i, littleEndian); view.setInt32(i * 14 + 6, i * i * i, littleEndian); view.setUint32(i * 14 + 10, i * i * i, littleEndian); } return buffer; } function doOneIterationDV(buffer, littleEndian) { var xor = 0; var view = new DataView(buffer); for (var i = 0; i < view.byteLength; i += 14) { xor ^= view.getInt8(i); xor ^= view.getUint8(i + 1); xor ^= view.getInt16(i + 2, littleEndian); xor ^= view.getUint16(i + 4, littleEndian); xor ^= view.getInt32(i + 6, littleEndian); xor ^= view.getUint32(i + 10, littleEndian); } } function doOneIterationJS(buffer, littleEndian) { var xor = 0; var reader; if (littleEndian) { reader = new LittleEndian(buffer); } else { reader = new BigEndian(buffer); } for (var i = 0; i < buffer.byteLength; i += 14) { xor ^= reader.getInt8(i); xor ^= reader.getUint8(i + 1); xor ^= reader.getInt16(i + 2); xor ^= reader.getUint16(i + 4); xor ^= reader.getInt32(i + 6); xor ^= reader.getUint32(i + 10); } } function doFloatIterations(dataView) { var buffer = makeFloatBuffer(1000); var iterations = 10; if (dataView) { for (var i = 0; i < iterations; i++) doOneFloatIterationDV(buffer); } else { for (var i = 0; i < iterations; i++) doOneFloatIterationJS(buffer); } } function makeFloatBuffer(size) { var buffer = new ArrayBuffer(size * 16); var view = new DataView(buffer); for (var i = 0; i < size; i++) { view.setFloat64(i * 16, Math.log10(i + 1)); view.setFloat32(i * 16 + 8, Math.sqrt(i)); view.setFloat32(i * 16 + 12, Math.cos(i)); } return buffer; } function doOneFloatIterationDV(buffer) { var sum = 0; var view = new DataView(buffer); for (var i = 0; i < view.byteLength; i += 16) { sum += view.getFloat64(i); sum += view.getFloat32(i + 8); sum += view.getFloat32(i + 12); } } function doOneFloatIterationJS(buffer) { var sum = 0; var float32array = new Float32Array(buffer); var float64array = new Float64Array(buffer); for (var i = 0; i < buffer.byteLength; i += 16) { sum += float64array[i/8]; sum += float32array[i/4 + 2]; sum += float32array[i/4 + 3]; } } function BigEndian(buffer, opt_byteOffset) { this.uint8View_ = new Uint8Array(buffer, opt_byteOffset || 0); this.int8View_ = new Int8Array(buffer, opt_byteOffset || 0); } BigEndian.prototype.getInt8 = function(byteOffset) { return this.int8View_[byteOffset]; }; BigEndian.prototype.getUint8 = function(byteOffset) { return this.uint8View_[byteOffset]; }; BigEndian.prototype.getInt16 = function(byteOffset) { return this.uint8View_[byteOffset + 1] | (this.int8View_[byteOffset] << 8); }; BigEndian.prototype.getUint16 = function(byteOffset) { return this.uint8View_[byteOffset + 1] | (this.uint8View_[byteOffset] << 8); }; BigEndian.prototype.getInt32 = function(byteOffset) { return this.uint8View_[byteOffset + 3] | (this.uint8View_[byteOffset + 2] << 8) | (this.uint8View_[byteOffset + 1] << 16) | (this.int8View_[byteOffset] << 24); }; BigEndian.prototype.getUint32 = function(byteOffset) { return this.uint8View_[byteOffset + 3] + (this.uint8View_[byteOffset + 2] << 8) + (this.uint8View_[byteOffset + 1] << 16) + (this.uint8View_[byteOffset] * (1 << 24)); }; function LittleEndian(buffer, opt_byteOffset) { this.uint8View_ = new Uint8Array(buffer, opt_byteOffset || 0); this.int8View_ = new Int8Array(buffer, opt_byteOffset || 0); } LittleEndian.prototype.getInt8 = function(byteOffset) { return this.int8View_[byteOffset]; }; LittleEndian.prototype.getUint8 = function(byteOffset) { return this.uint8View_[byteOffset]; }; LittleEndian.prototype.getInt16 = function(byteOffset) { return this.uint8View_[byteOffset] | (this.int8View_[byteOffset + 1] << 8); }; LittleEndian.prototype.getUint16 = function(byteOffset) { return this.uint8View_[byteOffset] | (this.uint8View_[byteOffset + 1] << 8); }; LittleEndian.prototype.getInt32 = function(byteOffset) { return this.uint8View_[byteOffset] | (this.uint8View_[byteOffset + 1] << 8) | (this.uint8View_[byteOffset + 2] << 16) | (this.int8View_[byteOffset + 3] << 24); }; LittleEndian.prototype.getUint32 = function(byteOffset) { return this.uint8View_[byteOffset] + (this.uint8View_[byteOffset + 1] << 8) + (this.uint8View_[byteOffset + 2] << 16) + (this.uint8View_[byteOffset + 3] * (1 << 24)); };