Last active
November 13, 2015 02:10
-
-
Save evanlucas/2e95a34b390bb55dae96 to your computer and use it in GitHub Desktop.
map and set perf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/deps/v8/src/collection.js b/deps/v8/src/collection.js | |
index 6d43384..b6a4c19 100644 | |
--- a/deps/v8/src/collection.js | |
+++ b/deps/v8/src/collection.js | |
@@ -179,8 +179,7 @@ function SetAdd(key) { | |
var chainEntry = ORDERED_HASH_TABLE_BUCKET_AT(table, bucket); | |
ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); | |
ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); | |
- FIXED_ARRAY_SET(table, index, key); | |
- FIXED_ARRAY_SET_SMI(table, index + 1, chainEntry); | |
+ FIXED_ARRAY_SET_TWO(table, index, key, index + 1, chainEntry); | |
return this; | |
} | |
@@ -369,9 +368,8 @@ function MapSet(key, value) { | |
var chainEntry = ORDERED_HASH_TABLE_BUCKET_AT(table, bucket); | |
ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); | |
ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); | |
- FIXED_ARRAY_SET(table, index, key); | |
- FIXED_ARRAY_SET(table, index + 1, value); | |
- FIXED_ARRAY_SET(table, index + 2, chainEntry); | |
+ FIXED_ARRAY_SET_THREE(table, index, key, index + 1, value, | |
+ index + 2, chainEntry); | |
return this; | |
} | |
diff --git a/deps/v8/src/macros.py b/deps/v8/src/macros.py | |
index 49b2cad..f67dc45 100644 | |
--- a/deps/v8/src/macros.py | |
+++ b/deps/v8/src/macros.py | |
@@ -278,6 +278,8 @@ define ITERATOR_KIND_ENTRIES = 3; | |
macro FIXED_ARRAY_GET(array, index) = (%_FixedArrayGet(array, (index) | 0)); | |
macro FIXED_ARRAY_SET(array, index, value) = (%_FixedArraySet(array, (index) | 0, value)); | |
+macro FIXED_ARRAY_SET_TWO(array, i1, v1, i2, v2) = (%_FixedArraySetTwo(array, (i1) | 0, v1, i2, (v2) | 0)); | |
+macro FIXED_ARRAY_SET_THREE(array, i1, v1, i2, v2, i3, v3) = (%_FixedArraySetThree(array, (i1) | 0, v1, (i2) | 0, v2, (i3) | 0, v3)); | |
# TODO(adamk): Find a more robust way to force Smi representation. | |
macro FIXED_ARRAY_SET_SMI(array, index, value) = (FIXED_ARRAY_SET(array, index, (value) | 0)); | |
diff --git a/deps/v8/src/runtime/runtime-array.cc b/deps/v8/src/runtime/runtime-array.cc | |
index fa0d91b..1dacf8f 100644 | |
--- a/deps/v8/src/runtime/runtime-array.cc | |
+++ b/deps/v8/src/runtime/runtime-array.cc | |
@@ -77,6 +77,37 @@ RUNTIME_FUNCTION(Runtime_FixedArraySet) { | |
} | |
+RUNTIME_FUNCTION(Runtime_FixedArraySetTwo) { | |
+ SealHandleScope shs(isolate); | |
+ DCHECK(args.length() == 5); | |
+ CONVERT_ARG_CHECKED(FixedArray, object, 0); | |
+ CONVERT_SMI_ARG_CHECKED(index, 1); | |
+ CONVERT_ARG_CHECKED(Object, value, 2); | |
+ CONVERT_SMI_ARG_CHECKED(index2, 3); | |
+ CONVERT_ARG_CHECKED(Object, value2, 4); | |
+ object->set(index, value); | |
+ object->set(index2, value2); | |
+ return isolate->heap()->undefined_value(); | |
+} | |
+ | |
+ | |
+RUNTIME_FUNCTION(Runtime_FixedArraySetThree) { | |
+ SealHandleScope shs(isolate); | |
+ DCHECK(args.length() == 7); | |
+ CONVERT_ARG_CHECKED(FixedArray, object, 0); | |
+ CONVERT_SMI_ARG_CHECKED(index, 1); | |
+ CONVERT_ARG_CHECKED(Object, value, 2); | |
+ CONVERT_SMI_ARG_CHECKED(index2, 3); | |
+ CONVERT_ARG_CHECKED(Object, value2, 4); | |
+ CONVERT_SMI_ARG_CHECKED(index3, 5); | |
+ CONVERT_ARG_CHECKED(Object, value3, 6); | |
+ object->set(index, value); | |
+ object->set(index2, value2); | |
+ object->set(index3, value3); | |
+ return isolate->heap()->undefined_value(); | |
+} | |
+ | |
+ | |
RUNTIME_FUNCTION(Runtime_TransitionElementsKind) { | |
HandleScope scope(isolate); | |
RUNTIME_ASSERT(args.length() == 2); | |
diff --git a/deps/v8/src/runtime/runtime.h b/deps/v8/src/runtime/runtime.h | |
index 4545426..69e80ae 100644 | |
--- a/deps/v8/src/runtime/runtime.h | |
+++ b/deps/v8/src/runtime/runtime.h | |
@@ -50,6 +50,8 @@ namespace internal { | |
F(GetCachedArrayIndex, 1, 1) \ | |
F(FixedArrayGet, 2, 1) \ | |
F(FixedArraySet, 3, 1) \ | |
+ F(FixedArraySetTwo, 5, 1) \ | |
+ F(FixedArraySetThree, 7, 1) \ | |
F(FastOneByteArrayJoin, 2, 1) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var phr = require('phr') | |
var h = process.hrtime() | |
for (var i = 0; i < 1e6; i++) { | |
var m = new Map() | |
m.set('a', '1') | |
m.set('b', '2') | |
} | |
h = process.hrtime(h) | |
console.log('bench', phr(h), 'ns/op') |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Map | |
before: 380.5 ns/op | |
after: 189.9 ns/op | |
Set | |
before: 343.7 ns/op | |
after: 179.8 ns/op |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var phr = require('phr') | |
var h = process.hrtime() | |
for (var i = 0; i < 1e6; i++) { | |
var m = new Set() | |
m.add('1') | |
m.add('2') | |
} | |
h = process.hrtime(h) | |
console.log('bench', phr(h), 'ns/op') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment