Closed koresar closed 6 years ago
Created a bug in V8 bugtracker: https://bugs.chromium.org/p/v8/issues/detail?id=6909
It sounds like V8 implemented some optimizations that are not available for objects created with Object.assign()
. Probably not a bug in v8 -- they just opened up a new fast path.
A performance degradation would mean that something got slower between v7 and v8. Sounds like the opposite happened?
It got x3 faster for plain objects, but x6 times slower for Obejct.assign
-ed objects.
It happened after they moved to the new pipeline in V8 v6.0: https://v8project.blogspot.com.au/2017/05/launching-ignition-and-turbofan.html
Oh, I see: Before: Stampit x 90,346,971 ops/sec After: Stampit x 19,520,623 ops/sec
Looks like the null
prototype is the problem. Try it with {}
as the prototype?
I will try.
Ok. Fixed it.
Instead of Object.create(descriptor.methods || null)
I put descriptor.methods ? Object.create(descriptor.methods) : {}
.
The performance is back!
Even better:
descriptor.methods ? {__proto__: descriptor.methods} : {};
Now, that's fast in any case! :)
Did you test the {__proto__: descriptor.methods} : {};
vs descriptor.methods ? Object.create(descriptor.methods) : {}
? Was there any perf difference?
descriptor.methods ? Object.create(descriptor.methods) : {}
and
descriptor.methods ? {__proto__: descriptor.methods} : {};
and
{__proto__: descriptor.methods}
are identical in my benchmark.
The last one is less code though. Tested in IE11, it works.
Faster in Node v7, too?
Tested against all node.js LTS 4,6,8. Property access of plain and stampit objects identical now in all three.
Node v7 did not have that problem. Only 8.x had.
Stampit has two benchmark tests. They all run fine in node.js v7 and less.
But in node.js 8 we have a problem:
1) Good news. Stampit object creation is 2x times faster. 2) Bad news. Stampit-created objects property access got x4 time slower. But native objects got 3x faster in node.js 8.
Need help.