map-get-string.js (3627B)
1 // Similar test as "cacheir/map-get-string.js", except that we now perform 2 // duplicate lookups to ensure GVN works properly. 3 4 // Return a new map, possibly filling some dummy entries to enforce creating 5 // multiple hash buckets. 6 function createMap(values, n) { 7 var xs = [...values]; 8 for (var i = 0; i < n; ++i) { 9 xs.push({}); 10 } 11 return new Map(xs.map((x, i) => [x, i + 1])); 12 } 13 14 function runTest(fn) { 15 fn(0); 16 fn(100); 17 } 18 19 function testConstant_different_map(n) { 20 var xs = ["a", "b"]; 21 var ys = ["c", "d"]; 22 var zs = [...xs, ...ys]; 23 var map = createMap(xs, n); 24 25 var N = 100; 26 var c = 0; 27 for (var i = 0; i < N; ++i) { 28 var z = zs[i & 3]; 29 var v = map.get(z); 30 if (v !== undefined) c += v; 31 var w = map.get(z); 32 if (w !== undefined) c += w; 33 } 34 assertEq(c, N + N / 2); 35 } 36 runTest(testConstant_different_map); 37 38 function testComputed_different_map(n) { 39 var xs = ["a", "b"]; 40 var ys = ["c", "d"]; 41 var zs = [...xs, ...ys]; 42 var map = createMap(xs, n); 43 44 var N = 100; 45 var c = 0; 46 for (var i = 0; i < N; ++i) { 47 var z = zs[i & 3]; 48 z = String.fromCharCode(z.charCodeAt(0)); 49 var v = map.get(z); 50 if (v !== undefined) c += v; 51 var w = map.get(z); 52 if (w !== undefined) c += w; 53 } 54 assertEq(c, N + N / 2); 55 } 56 runTest(testComputed_different_map); 57 58 function testRope_different_map(n) { 59 var xs = ["a", "b"]; 60 var ys = ["c", "d"]; 61 var zs = [...xs, ...ys]; 62 var map = createMap(xs.map(x => x.repeat(100)), n); 63 64 var N = 100; 65 var c = 0; 66 for (var i = 0; i < N; ++i) { 67 var z = zs[i & 3].repeat(100); 68 var v = map.get(z); 69 if (v !== undefined) c += v; 70 var w = map.get(z); 71 if (w !== undefined) c += w; 72 } 73 assertEq(c, N + N / 2); 74 } 75 runTest(testRope_different_map); 76 77 // Duplicate the above tests, but this time use a different map. 78 79 function testConstant_different_map(n) { 80 var xs = ["a", "b"]; 81 var ys = ["c", "d"]; 82 var zs = [...xs, ...ys]; 83 var map1 = createMap(xs, n); 84 var map2 = createMap(xs, n); 85 86 var N = 100; 87 var c = 0; 88 for (var i = 0; i < N; ++i) { 89 var z = zs[i & 3]; 90 var v = map1.get(z); 91 if (v !== undefined) c += v; 92 var w = map2.get(z); 93 if (w !== undefined) c += w; 94 } 95 assertEq(c, N + N / 2); 96 } 97 runTest(testConstant_different_map); 98 99 function testComputed_different_map(n) { 100 var xs = ["a", "b"]; 101 var ys = ["c", "d"]; 102 var zs = [...xs, ...ys]; 103 var map1 = createMap(xs, n); 104 var map2 = createMap(xs, n); 105 106 var N = 100; 107 var c = 0; 108 for (var i = 0; i < N; ++i) { 109 var z = zs[i & 3]; 110 z = String.fromCharCode(z.charCodeAt(0)); 111 var v = map1.get(z); 112 if (v !== undefined) c += v; 113 var w = map2.get(z); 114 if (w !== undefined) c += w; 115 } 116 assertEq(c, N + N / 2); 117 } 118 runTest(testComputed_different_map); 119 120 function testRope_different_map(n) { 121 var xs = ["a", "b"]; 122 var ys = ["c", "d"]; 123 var zs = [...xs, ...ys]; 124 var map1 = createMap(xs.map(x => x.repeat(100)), n); 125 var map2 = createMap(xs.map(x => x.repeat(100)), n); 126 127 var N = 100; 128 var c = 0; 129 for (var i = 0; i < N; ++i) { 130 var z = zs[i & 3].repeat(100); 131 var v = map1.get(z); 132 if (v !== undefined) c += v; 133 var w = map2.get(z); 134 if (w !== undefined) c += w; 135 } 136 assertEq(c, N + N / 2); 137 } 138 runTest(testRope_different_map); 139 140 // Test the alias information is correct. 141 142 function test_alias(n) { 143 var xs = ["a", "b"]; 144 var map = createMap([], n); 145 146 var N = 100; 147 var c = 0; 148 for (var i = 0; i < N; ++i) { 149 var x = xs[i & 1]; 150 151 map.set(x, 1); 152 var v = map.get(x); 153 154 map.delete(x); 155 var w = map.get(x); 156 157 c += v; 158 assertEq(w, undefined); 159 } 160 assertEq(c, N); 161 } 162 runTest(test_alias);