Показаны сообщения с ярлыком jsfiddle. Показать все сообщения
Показаны сообщения с ярлыком jsfiddle. Показать все сообщения

19 авг. 2015 г.

Глубина стека JavaScript (дубль 3)

Продолжение (первая часть, вторая часть)

Баг в Firefox подсказал, что глубина стека зависит ещё и от метода вызова (fn(), fn.call(), fn.apply()), и от контекста функции (fn.call(null) или fn.call(this)), и от платформы (Firefox 39/Win vs. Firefox 39/Linux). В одном из комментариев было указано, что при переходе с прямого вызова fn() на fn.call() в версии Firefox под Linux глубина стека уменьшалась с 7000 до 500.

Добавил в скрипт подсчёт глубины стека при использовании call.

Результаты

Windows 7 64-bit:
Chrome 44:    глубина стека не зависит от метода вызова
Safari 5.1.7: глубина стека не зависит от метода вызова
IE11:         fn() 2800..2300, fn.call() 1900..1700
Firefox 39:   fn() 8400..4800, fn.call() 7200..5600

Windows 10:
Edge:         fn() 5000,80026..81336, fn.call() 5207..5291
Firefox Dev. edition 43.0a2: fn() 3500..3000, fn.call() 4400..3300

Интересные факты:

  • В Firefox/Win при отсутствии передаваемых аргументов прямой вызов fn() иногда занимает меньше памяти в стеке, чем fn.call(this), при наличии аргументов - всегда fn.call(this, arg) занимает меньше, чем fn(arg).
  • В Firefox/Linux fn.call() в некоторых случаях даёт на порядок меньшую глубину стека.
  • В IE11 fn.call() даёт в 1.3 - 1.4 раза меньшую глубину стека.
  • В Edge первый запуск может дать глубину стека fn() около 5000, последующие запуски дают глубину стека около 80000


26 авг. 2014 г.

Глубина стека JavaScript (дубль 2)

Продолжение (первая часть здесь).

На http://www.2ality.com/2014/04/call-stack-size.html натолкнулся на мысль, что измеряемая глубина стека зависит от размера фрейма (который может зависеть от локальных переменных и аргументов функции). Дополнил скрипт, заодно для наглядности вставил рисование графика глубины стека в зависимости от количества аргументов/локальных переменных. Результат:

Кол-во
аргументов/     0/0    1/0    1/1    1/2    1/3
переменных

Chrome 39:      41962  31472  27975  25178  22889  ±50
Chrome 36:      20986  15740  13991  12592  11447  ±50
Safari 5.1.7:   65532  58250  52425  47659  43688
Opera 12.17:    32624  31505  32691  31478  31419
Opera 17:       21002  15752  14002  12602  11456  ±50
IE9 (IETester): 24789  20657  20657  20657  20657
IE11:           32000..62000 не зависит от кол-ва переменных
Firefox 20:     27000..52000 не зависит от кол-ва переменных
Firefox 31:      6600..21000 не зависит от кол-ва переменных

Результаты для IE11 и Firefox не зависят от количества локальных переменных/аргументов, и сильно изменяются от запуска к запуску.

Результаты для Chrome и новой Opera незначительно изменяются после первого запуска, далее остаются постоянными.


4 мар. 2014 г.

Порядок перечисления в for-in и Object.keys()

ECMAScript Language Specification Edition 3 (ECMA-262-3):

  • 4.3.3 Object
    An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function.
  • 12.6.4 The for-in Statement
    The mechanics of enumerating the properties (get the name of the next property ... that doesn't have the DontEnum attribute) is implementation dependent.
ECMAScript Language Specification Edition 5.1 (ECMA-262-5.1):
  • 8.6 The Object Type
    An Object is a collection of properties.
  • 12.6.4 The for-in Statement
    The mechanics and order of enumerating the properties (let P be the name of the next property of obj whose [[Enumerable]] attribute is true) is not specified.
  • 15.2.3.14 Object.keys ( O )
    If an implementation defines a specific order of enumeration for the for-in statement, that same enumeration order must be used in step 5 of this algorithm.

4 сент. 2013 г.

Максимальная длина массива в Function.prototype.apply

MDN предупреждает, что максимальная длина массива, передаваемая в Function.prototype.apply, ограничена (порядка 10^4). Меня заинтересовали точные значения, которые я определяю вот таким скриптом.

30 июл. 2013 г.

Глубина стека JavaScript в разных браузерах

Скрипт для измерения глубины стека и результаты (получены на одном компьютере, Windows 7 SP1, 64-bit):

Chrome 28:      20966 - 21000, не зависит от количества открытых вкладок
Firefox 20:     26000 - 50000, сильно изменяется от измерения к измерению
Firefox 22:     38000 - 53000, сильно изменяется от измерения к измерению
Opera 12.16:    32629, не зависит от количества открытых вкладок
Opera 15:       20968, не зависит от количества открытых вкладок
IE10:            2946 - 2947, не зависит от количества открытых вкладок, включения/выключения отладки JavaScript, выбора Browser Mode/Document Mode
IE9 (IETester): 20670, не зависит от количества открытых вкладок
IE8 (IETester):  1472 - 1475, не зависит от количества открытых вкладок
IE7 (IETester):  2546 - 2548, не зависит от количества открытых вкладок
IE6 (IETester):  2546 - 2548, не зависит от количества открытых вкладок

Результаты для IE на разных компьютерах различаются на два порядка, на одной из машин в IE9 была получена глубина стека 42329, на другой для IE8 (IE9 downgraded to IE8) было всего 276 (!).

13 нояб. 2012 г.

Поддержка браузерами субпиксельных размеров

Согласно спецификации CSS2 размеры элементов в пикселях могут быть дробными, например #id {width: 100.5px;}. Некоторые браузеры не поддерживают субпиксельные размеры, усекая их до меньшего целого числа. Как написать feature test (во время загрузки страницы определить, поддерживает ли браузер субпиксельные размеры)?

25 окт. 2011 г.

Фокусы с фокусом в Opera

Случайно наткнулся на неприятную проблему в Opera, которая существовала ещё в версии 9.64 (а может и в более ранних, просто это самая старая версия, которая у меня имелась), и существует до сих пор (в версии 11.51 - последней имеющейся у меня на момент написания статьи).