2018-05-14 15:02:23 +00:00
|
|
|
// 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),
|
|
|
|
]);
|
|
|
|
|
2018-06-29 13:13:30 +00:00
|
|
|
new BenchmarkSuite('DataViewTest-DataView-Floats', [1000], [
|
|
|
|
new Benchmark('DataViewTest-DataView-Floats', false, false, 0, doTestDataViewFloats),
|
|
|
|
]);
|
|
|
|
|
2018-05-14 15:02:23 +00:00
|
|
|
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),
|
|
|
|
]);
|
|
|
|
|
2018-06-29 13:13:30 +00:00
|
|
|
new BenchmarkSuite('DataViewTest-TypedArray-Floats', [1000], [
|
|
|
|
new Benchmark('DataViewTest-TypedArray-Floats', false, false, 0, doTestTypedArrayFloats),
|
|
|
|
]);
|
|
|
|
|
2018-05-14 15:02:23 +00:00
|
|
|
function doTestDataViewBigEndian() {
|
|
|
|
doIterations(false, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
function doTestDataViewLittleEndian() {
|
|
|
|
doIterations(true, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
function doTestTypedArrayBigEndian() {
|
|
|
|
doIterations(false, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
function doTestTypedArrayLittleEndian() {
|
|
|
|
doIterations(true, false);
|
|
|
|
}
|
|
|
|
|
2018-06-29 13:13:30 +00:00
|
|
|
function doTestDataViewFloats() {
|
|
|
|
doFloatIterations(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
function doTestTypedArrayFloats() {
|
|
|
|
doFloatIterations(false);
|
|
|
|
}
|
|
|
|
|
2018-05-14 15:02:23 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-29 13:13:30 +00:00
|
|
|
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];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-14 15:02:23 +00:00
|
|
|
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));
|
|
|
|
};
|