Skip to content

Instantly share code, notes, and snippets.

@evanlucas
Last active November 13, 2015 02:10
Show Gist options
  • Save evanlucas/2e95a34b390bb55dae96 to your computer and use it in GitHub Desktop.
Save evanlucas/2e95a34b390bb55dae96 to your computer and use it in GitHub Desktop.
map and set perf
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)
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')
Map
before: 380.5 ns/op
after: 189.9 ns/op
Set
before: 343.7 ns/op
after: 179.8 ns/op
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