1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar MapBenchmark = new BenchmarkSuite('WeakMap', [1000], [
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new Benchmark('Set', false, false, 0, WeakMapSet),
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new Benchmark('Has', false, false, 0, WeakMapHas, WeakMapSetup,
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      WeakMapTearDown),
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new Benchmark('Get', false, false, 0, WeakMapGet, WeakMapSetup,
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      WeakMapTearDown),
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new Benchmark('Delete', false, false, 0, WeakMapDelete, WeakMapSetup,
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      WeakMapTearDown),
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch]);
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar wm;
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar N = 10;
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar keys = [];
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < N * 2; i++) {
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  keys[i] = {};
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction WeakMapSetup() {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  wm = new WeakMap;
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < N; i++) {
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    wm.set(keys[i], i);
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction WeakMapTearDown() {
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  wm = null;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction WeakMapSet() {
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WeakMapSetup();
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WeakMapTearDown();
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction WeakMapHas() {
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < N; i++) {
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!wm.has(keys[i])) {
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw new Error();
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = N; i < 2 * N; i++) {
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (wm.has(keys[i])) {
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw new Error();
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction WeakMapGet() {
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < N; i++) {
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (wm.get(keys[i]) !== i) {
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw new Error();
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = N; i < 2 * N; i++) {
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (wm.get(keys[i]) !== undefined) {
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw new Error();
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction WeakMapDelete() {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This is run more than once per setup so we will end up deleting items
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // more than once. Therefore, we do not the return value of delete.
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < N; i++) {
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    wm.delete(keys[i]);
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
81