Pull to refresh

Comments 30

Что уже дождаться не могу — короткий синтаксис функций и деструктивное присваивание.
И спасибо за обзор)
Всегда интересовало, чем же arguments и конкретно arguments.callee так плохи?
arguments — ничем. arguments.callee — скоростью, так что в strict его запрещено использовать.
v8 выключает все оптимизации на код, где используется arguments.
Где про это можно почитать?
Странное поведение, если это правда.
у arguments object достаточно мутная семантика, поэтому если v8 видит, что он используется нетривиальным образом, то она отказывается оптимизировать. это проистекает из соображения, что в коде, для которого важны оптимизации, arguments чаще всего не используется или используется тривиальным способом, поэтому и реализовывать сложную поддержку нет смысла. (меньше сложностей — меньше багов).
или используется тривиальным способом

Что-то вроде
<code>var args = Array.slice(arguments);</code>

?
Array.prototype.slice.call(arguments);

Раньше часто встречал, что нет. Тоже интересно узнать, изменилось что или нет. Сомневаюсь.
Спасибо. Надо будет придумать побольше вопросов к Форуму Технологий :)
Владислав Егоров писал об этом подробно в группе nodejs.
извинения выслал в карму)))
это не совсем верно, ряд конструкций поддерживается в оптимизированном коде: arguments[i], arguments.length, func.apply(obj, arguments)

Может код и оптимизируется, но такому тесту я был, мягко сказано, удивлён. @jsperf. Обратите внимание на 3ий тест, где по отношению ко 2ому уменьшен доступ к arguments[i] и код становится быстрее в 2 раза(в хроме), а в лисе даже в 3 раза. И счет идёт на миллионы операций, так что «в 2 раза» это существенно быстрее. Или я где-то просчитался в тесте?
выход заграницы arguments при чтении arguments[i] вызывает деоптимизацию, что и наблюдается.

тест кстати слегка шумный: например, непонятно зачем там создается closure на каждую итерацию цикла.
Ясно, получается arguments[i] дорогой только в случае IndexOutOfRange, спасибо. Добавил testcase с fake аргументами и скорость сравнялась.

Согласен что можно было инициализацию функции вывести в setup function теста, но так как инициализация соблюдена для всех тестов, то это не проблема, ведь не сама скорость теста важна, а их соотношение.
Спасибо за статью. Уже обнаружил Proxy в своей Aurora (это которая Firefox Nightly).

P. S. Ставьте пожалуйста пробела вокруг =.
> либо segmentation fault, либо синтаксическая ошибка
В багтрекере надо его оформить
По поводу файла с флагами — вообще не уверен, что баг — файл с V8, умирает нода — может исключительно под такое сочитание настроена. Хотя и тут про него пишут, но для 0.7.0.
По поводу модулей — надо бы, но еще потыкаюсь лучше, как время будет:)
> в Map мусор собирается аналогично WeakMap

нет, Mapом все должно удерживаться, как вы проверяли?
Написал судя по конфигу:
DEFINE_bool(collect_maps, true, «garbage collect maps from which no objects can be reached»)
может не правильно понял, чуть позже проверю.
это не о тех mapах, это о скрытых классах, внутри они называются Map.
Вы правы. Протестировал в хроме на
var arr=[],map=new Map,i;
for(i=0;i<1000000;i++){
	arr.push({});
	map.set(arr[i],{});}
m=undefined;

и аналогичном для WeakMap — после запуска gc Map, как и положено, не чистится.
кстати проверить чистится ли WeakMap или нет на чистом JavaScriptе нельзя, он специально так задизайнен чтобы сделать сборку мусора ненаблюдаемой :-)
Блин, arr вместо m в конце, хотя пофик:)
Sign up to leave a comment.

Articles