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/721fa65a-e310-4315-9166-e6beae89ce47n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/v8-dev/721fa65a-e310-4315-9166-e6beae89ce47n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> -- 
>
>
> Google Germany GmbH
>
> Erika-Mann-Straße 33
>
> 80636 München
>
> Geschäftsführer: Paul Manicle, Liana Sebastian.
>
> Registergericht und -nummer: Hamburg, HRB 86891
>
> Sitz der Gesellschaft: Hamburg
>
> Diese E-Mail ist vertraulich. Falls sie diese fälschlicherweise erhalten 
> haben sollten, leiten Sie diese bitte nicht an jemand anderes weiter, 
> löschen Sie alle Kopien und Anhänge davon und lassen Sie mich bitte wissen, 
> dass die E-Mail an die falsche Person gesendet wurde. 
>
>     
>
> This e-mail is confidential. If you received this communication by 
> mistake, please don't forward it to anyone else, please erase all copies 
> and attachments, and please let me know that it has gone to the wrong 
> person.
>

-- 
-- 
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/3103083d-adf4-4744-a97f-7fc4b3fade14n%40googlegroups.com.

Reply via email to