Защо стринговият литерал е по-бърз от стринговия обект?

Моето разбиране за двигателя е, че когато става въпрос за литерали, той всъщност ще създаде нов временен обект, когато се извика метод на литерала.

Така че или разбирането ми е грешно, или резултатът се нуждае от обяснение: http://jsperf.com/literal-vs-object-231


person hilfe    schedule 11.04.2015    source източник
comment
Теста не показва нищо, защото не работи правилно. Трябва да поставите инициализацията в блока за инициализация и да не повтаряте кода, който трябва да бъде измерен. Тестовият двигател прави цикъла.   -  person Guffa    schedule 12.04.2015
comment
ако не уловите изхода, няма начин да разберете, че ядрото на JS не мами и не пропуска работата, която очаквате да свърши.   -  person dandavis    schedule 12.04.2015


Отговори (2)


той всъщност ще създаде нов временен обект при всяко извикване на метод

Ами да, така се указват извикванията на метод на примитивни стойности. Въпреки това, той се използва само за обяснение на поведението (тъй като това е лесен начин да се опише как търсенето на свойства трябва да завърши върху собствените прототипи), а не да се каже как всъщност е приложено (статичен достъп до String.prototype, без включен временен обект).

Защо стринговият литерал е по-бърз от стринговия обект?

И така, какво прави един двигател с низови литерали? Те са константи. Видът им е известен. Достъп до имот - знаем какво се случва. Чакай, някой прави ли нещо с резултатите? Защо изобщо да извиквате функция без странични ефекти?

Виждате докъде води това: оптимизация. Не се заблуждавайте от компилатора на микробенчмарковете.

person Bergi    schedule 11.04.2015

Браузърите могат и ще оптимизират собствените методи за низове. Извикването на String.toUpperCase() е по-бързо на литерал, защото JS машината е достатъчно интелигентна, за да предостави просто низа с главни букви и да не прави ненужното принуждаване.

Ако предоставите персонализиран метод, извикването му е по-бързо за обекта, поне в Chrome (това зависи много от JS двигателя), тъй като двигателят няма стратегия за оптимизация за него. Вижте http://jsperf.com/literal-vs-object-231/2.

person JJJ    schedule 11.04.2015