Got it. Good to know this. Thanks a lot.

在2022年10月18日星期二 UTC+8 18:02:52<ma...@chromium.org> 写道:

> I'd say at that point we're at the expected range of slowdown, given less 
> optimization opportunities and no ICs when you go through the API.
>
>
> On Tue, Oct 18, 2022 at 11:04 AM James Chen <dumg...@gmail.com> wrote:
>
>> @Marja , According to your suggestion, I updated the test case with more 
>> random string access instead of const string. The new result is that CPP 
>> test case performs 2~3 times slower than JS test case now.
>>
>> I posted more detail information at the end of  
>> https://github.com/cocos/cocos-engine/issues/12878  here .
>>
>> 2~3 times slower is still not good enough for us to switch 
>> deserialization logic from JS to CPP. 
>> So, is 2~3 times slower expected ? Or are there more things I could do?
>>
>> > 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.
>>
>> @Jakob, Thank you for pointing me out that inline caches also make some 
>> optimizations.
>>
>>
>> 在2022年10月17日星期一 UTC+8 17:54:34<Jakob Kummerow> 写道:
>>
>>> 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 <dumg...@gmail.com> 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<ma...@chromium.org> 写道:
>>>>
>>>>> 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 <dumg...@gmail.com> 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
>> v8-...@googlegroups.com
>> 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 v8-dev+un...@googlegroups.com.
>>
> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/v8-dev/efc01cf2-8383-4034-abff-5a0d2cc54bd4n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/v8-dev/efc01cf2-8383-4034-abff-5a0d2cc54bd4n%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
v8-dev@googlegroups.com
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 v8-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-dev/3290bde5-8f69-43b6-8f50-7d408c09bddbn%40googlegroups.com.

Reply via email to