| // 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)); |
| }; |