In addition to what Marja said, I assume that a significant difference
(even without JIT) is that JavaScript can use Inline Caches, whereas the
API cannot.


On Mon, Oct 17, 2022 at 10:34 AM James Chen <[email protected]> wrote:

> Got it. I would modify my test code to see whether the result  could get
> better.
>
> Thanks for your reply. :)
>
> 在2022年10月17日星期一 UTC+8 13:59:35<[email protected]> 写道:
>
>> Hi,
>>
>> I didn't have a deep look, but your benchmarking might not be
>> representative.
>>
>> 1) V8 probably optimizes such a tight loop a lot (in the JIT mode).
>> You're using string constants as property names, and V8 sees the whole
>> object creation code at once, and can generate better optimized code. When
>> we only need to do one v8::Object::Set, we can't do the same optimizations.
>> (Very hand-wavy explanation; I didn't look at the actual generated code in
>> this case.) If you make the object shape and property names + values more
>> unpredictable (also if you make the benchmark closer to what your actual
>> deserializer does), you might see a smaller difference. You'll also need to
>> take into account the time needed for V8 to parse + compile the code, not
>> only the JS execution time.
>>
>> 2) The string creation (for the property names) is done when we parse the
>> JS code, so it's outside your benchmark timer. In your C++ version, I
>> assume it's inside your benchmark timer.
>>
>> The "16 times faster in the non-JIT mode" is a bit high though, I
>> would've guessed the difference would be smaller.
>>
>> Cheers,
>>
>> On Mon, Oct 17, 2022 at 4:12 AM James Chen <[email protected]> wrote:
>>
>>> Hello V8 team, thanks for making V8 engine which could run JavaScript
>>> super fast.
>>>
>>> Recently, I want to improve the performance of deserialization for Cocos
>>> Creator game engine.
>>>
>>> Cocos Creator uses V8 for its default JavaScript engine and benefited
>>> from V8's high performance. There're many classes implemented in JS and
>>> some implemented in C++. And there will be more and more JS code moved to
>>> C++ side.
>>>
>>> I thought about deserializing game assets directly in C++ rather than in
>>> JS to get better performance since I think C++ code should be faster.
>>>
>>> Therefore, I wrote a testcase to test whether we could get benefited
>>> from C++ code. But unfortunately, I got a really bad result saying that
>>> create JS object and setting properties in C++ by V8 API is really slower
>>> than doing that in JS. It's about 50 times slower, in another word, JS
>>> execution is really fast.
>>>
>>> I debugged a little bit and found that the most heavy cost is in
>>> v8::Object::Set and v8::String::NewFromUtf8.
>>>
>>> Part of JS test code:
>>> const testArr = new Array<MySerializationTestClass>(this.loopCount);
>>>         const start = performance.now();
>>>
>>>         for (let i = 0; i < this.loopCount; ++i) {
>>>             const test = new MySerializationTestClass();
>>>             testArr[i] = test;
>>>
>>>             test['booleanValue'] = false;
>>>             test['nullValue'] = null;
>>>             test['undefinedValue'] = undefined;
>>>             test['numberValue0'] = 100.123;
>>>             test['numberValue1'] = 230.2345;
>>>             test['numberValue2'] = 330.2345;
>>>             test['numberValue3'] = 430.2345;
>>>             test['numberValue4'] = 530.2345;
>>>
>>>             test['stringValue0'] = 'hello 0';
>>>
>>>             test['stringValue1'] = 'hello 1';
>>>
>>> The logic of CPP test code is the same as which in the above JS test
>>> code. The difference is that we use v8::Object::Set API.
>>>
>>> ### JIT Enabled
>>>
>>> Cpp code is 55 times slower than JS code.
>>>
>>> ### JIT Disabled
>>>
>>> Cpp code is 16 times slower than JS code.
>>>
>>>
>>> ### Xcode Profile
>>>
>>>
>>> `v8::Maybe<bool> ret =
>>> _obj.handle(__isolate)->Set(__isolate->GetCurrentContext(),
>>> nameValue.ToLocalChecked(), value);` and `v8::String::NewFromUtf8` are the
>>> main hotspots.
>>>
>>> ### What I guess
>>>
>>> I guess running JS code directly could make use of the optimization by
>>> V8 Bytecode and JIT by TurboFan. But invoking V8 C++ API will not get the
>>> optimization.
>>>
>>>
>>> Could you point me out that whether my guess is correct or not? Also, is
>>> there a better V8 API for setting property?  Thanks.
>>>
>>

-- 
-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-dev/CAKSzg3Ssoev-czmjbKJPdCFT_4s4wsZK8PTupu7bs1SwABDOiw%40mail.gmail.com.

Reply via email to