Commit 7a540779 authored by Jaroslav Sevcik's avatar Jaroslav Sevcik Committed by Commit Bot

[js-tests] Add benchmarks for large hash tables.

Change-Id: I1157ef6baaf60bdbf5d55a1b8f75edb15794baef
Bug: v8:6916
Reviewed-on: https://chromium-review.googlesource.com/715800Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Jaroslav Sevcik <jarin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48724}
parent 50112799
......@@ -2,30 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var N = 10;
var LargeN = 1e4;
var keys;
function SetupSmiKeys() {
keys = new Array(N * 2);
for (var i = 0; i < N * 2; i++) {
keys[i] = i;
}
function SetupSmiKeys(count = 2 * N) {
keys = Array.from({ length : count }, (v, i) => i);
}
function SetupStringKeys() {
keys = new Array(N * 2);
for (var i = 0; i < N * 2; i++) {
keys[i] = 's' + i;
}
function SetupStringKeys(count = 2 * N) {
keys = Array.from({ length : count }, (v, i) => 's' + i);
}
function SetupObjectKeys() {
keys = new Array(N * 2);
for (var i = 0; i < N * 2; i++) {
keys[i] = {};
}
function SetupObjectKeys(count = 2 * N) {
keys = Array.from({ length : count }, (v, i) => ({}));
}
......@@ -10,7 +10,6 @@ var MapSmiBenchmark = new BenchmarkSuite('Map-Smi', [1000], [
new Benchmark('Delete', false, false, 0, MapDeleteSmi, MapSetupSmi, MapTearDown),
]);
var MapStringBenchmark = new BenchmarkSuite('Map-String', [1000], [
new Benchmark('Set', false, false, 0, MapSetString, MapSetupStringBase, MapTearDown),
new Benchmark('Has', false, false, 0, MapHasString, MapSetupString, MapTearDown),
......@@ -18,7 +17,6 @@ var MapStringBenchmark = new BenchmarkSuite('Map-String', [1000], [
new Benchmark('Delete', false, false, 0, MapDeleteString, MapSetupString, MapTearDown),
]);
var MapObjectBenchmark = new BenchmarkSuite('Map-Object', [1000], [
new Benchmark('Set', false, false, 0, MapSetObject, MapSetupObjectBase, MapTearDown),
new Benchmark('Has', false, false, 0, MapHasObject, MapSetupObject, MapTearDown),
......@@ -26,68 +24,66 @@ var MapObjectBenchmark = new BenchmarkSuite('Map-Object', [1000], [
new Benchmark('Delete', false, false, 0, MapDeleteObject, MapSetupObject, MapTearDown),
]);
var MapObjectLargeBenchmark = new BenchmarkSuite('Map-Object-Set-Get-Large', [1e7], [
new Benchmark('Set-Get', false, false, 0, MapSetGetObjectLarge,
MapSetupObjectBaseLarge, MapTearDown),
]);
var MapIterationBenchmark = new BenchmarkSuite('Map-Iteration', [1000], [
new Benchmark('ForEach', false, false, 0, MapForEach, MapSetupSmi, MapTearDown),
]);
var MapIterationBenchmark = new BenchmarkSuite('Map-Iterator', [1000], [
new Benchmark('Iterator', false, false, 0, MapIterator, MapSetupSmi, MapTearDown),
]);
var map;
function MapSetupSmiBase() {
SetupSmiKeys();
map = new Map;
}
function MapSetupSmi() {
MapSetupSmiBase();
MapSetSmi();
}
function MapSetupStringBase() {
SetupStringKeys();
map = new Map;
}
function MapSetupString() {
MapSetupStringBase();
MapSetString();
}
function MapSetupObjectBase() {
SetupObjectKeys();
map = new Map;
}
function MapSetupObjectBaseLarge() {
SetupObjectKeys(2 * LargeN);
map = new Map;
}
function MapSetupObject() {
MapSetupObjectBase();
MapSetObject();
}
function MapTearDown() {
map = null;
}
function MapSetSmi() {
for (var i = 0; i < N; i++) {
map.set(keys[i], i);
}
}
function MapHasSmi() {
for (var i = 0; i < N; i++) {
if (!map.has(keys[i])) {
......@@ -101,7 +97,6 @@ function MapHasSmi() {
}
}
function MapGetSmi() {
for (var i = 0; i < N; i++) {
if (map.get(keys[i]) !== i) {
......@@ -124,14 +119,12 @@ function MapDeleteSmi() {
}
}
function MapSetString() {
for (var i = 0; i < N; i++) {
map.set(keys[i], i);
}
}
function MapHasString() {
for (var i = 0; i < N; i++) {
if (!map.has(keys[i])) {
......@@ -159,7 +152,6 @@ function MapGetString() {
}
}
function MapDeleteString() {
// This is run more than once per setup so we will end up deleting items
// more than once. Therefore, we do not the return value of delete.
......@@ -168,14 +160,12 @@ function MapDeleteString() {
}
}
function MapSetObject() {
for (var i = 0; i < N; i++) {
map.set(keys[i], i);
}
}
function MapHasObject() {
for (var i = 0; i < N; i++) {
if (!map.has(keys[i])) {
......@@ -189,7 +179,6 @@ function MapHasObject() {
}
}
function MapGetObject() {
for (var i = 0; i < N; i++) {
if (map.get(keys[i]) !== i) {
......@@ -203,6 +192,21 @@ function MapGetObject() {
}
}
function MapSetGetObjectLarge() {
for (var i = 0; i < LargeN; i++) {
map.set(keys[i * 2], i);
}
for (var i = 0; i < LargeN; i++) {
if (map.get(keys[i * 2]) !== i) {
throw new Error();
}
}
for (var i = N; i < 2 * LargeN; i++) {
if (map.get(keys[i * 2 + 1]) !== undefined) {
throw new Error();
}
}
}
function MapDeleteObject() {
// This is run more than once per setup so we will end up deleting items
......@@ -212,7 +216,6 @@ function MapDeleteObject() {
}
}
function MapForEach() {
map.forEach(function(v, k) {
if (v !== k) {
......@@ -221,7 +224,6 @@ function MapForEach() {
});
}
function MapIterator() {
var result = 0;
for (const v of map.values()) result += v;
......
......@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
"use strict";
load('../base.js');
load('common.js');
......
......@@ -14,6 +14,11 @@ var MapBenchmark = new BenchmarkSuite('WeakMap', [1000], [
WeakMapTearDown),
]);
var MapBenchmark = new BenchmarkSuite('WeakMapSetGet-Large', [1e7], [
new Benchmark('Set-Get', false, false, 0, WeakMapSetGetLarge,
WeakMapSetupBaseLarge, WeakMapTearDown),
]);
var wm;
......@@ -24,6 +29,12 @@ function WeakMapSetupBase() {
}
function WeakMapSetupBaseLarge() {
SetupObjectKeys(2 * LargeN);
wm = new WeakMap;
}
function WeakMapSetup() {
WeakMapSetupBase();
WeakMapSet();
......@@ -77,3 +88,19 @@ function WeakMapDelete() {
wm.delete(keys[i]);
}
}
function WeakMapSetGetLarge() {
for (var i = 0; i < LargeN; i++) {
wm.set(keys[i * 2], i);
}
for (var i = 0; i < LargeN; i++) {
if (wm.get(keys[i * 2]) !== i) {
throw new Error();
}
}
for (var i = N; i < 2 * LargeN; i++) {
if (wm.get(keys[i * 2 + 1]) !== undefined) {
throw new Error();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment