Почему Safari предлагает почти противоположные результаты здесь? - PullRequest
1 голос
/ 29 сентября 2010

Тестируйте здесь: http://jsperf.com/test-for-speed-of-various-conditionals

Мне интересно, получают ли другие те же результаты, и что люди могут подумать о том, почему результаты различаются (особенно в Safari) в разных браузерах.Интересно то, как демократически Firefox обрабатывает различные случаи.

Пожалуйста, сообщите, если что-то ужасно неправильно с моей методологией:)

Firefox 3.6 / Mac OSX 10.64: ​​Switch = 824 352 Ops / sec (14% медленнее)
Если / иначе = 530,062 (44% медленнее, медленнее)
Хэш / ленивый = 968,035 (самый быстрый)
Хэш / если / еще = 963,765 (0% медленнее)

Chrome 6.0.472.63/Mac OSX 10.64: ​​
Переключатель = 10 220 039 операций в секунду (на 62% медленнее)
Если / иначе = 7 744 284 (на 71% медленнее, медленнее)
Хэш / ленивость = 27 130 039 (быстрее всего)
Хэш / если / еще = 25 297 370 (на 6% медленнее)

Safari 5.0.2 / Mac OSX 10.64: ​​
Переключатель = 15 044 132 об / с (сек.)
Если / еще = 1 793 051 (88% медленнее, медленнее)
хэш / ленивый = 10 381 941 (30% медленнее)
хэш / если / еще = 11 119 576 (26% медленнее)

Opera 10.10 / Mac OSX 10.64: ​​
Переключатель = 497 238 операций в секунду (на 32% медленнее)
Если / иначе = 250 904 (на 66% медленнее, медленнее)
Хэш / ленивый = 740 520 (самый быстрый)
Хэш / если / еще = 634 424 (14%Sниже)

MSIE 8.0 / Windows NT:
Переключатель = 176,267 операций в секунду (60% медленнее)
Если / иначе = 124,783 (72% медленнее, медленнее)
Хэш / ленивый =447 421 (самый быстрый)
Хэш / если / еще = 442 736 (14% медленнее)

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Javascript имеет спецификацию , но не определяет реализацию;поставщики браузеров должны определить, как реализовать спецификацию (что также приводит к множеству кросс-браузерных проблем, хотя в последнее время они становятся лучше).Вероятно, то, как различные браузеры реализуют различные методы, которые вы используете, отличается.

0 голосов
/ 30 сентября 2010

Это не совсем честные тесты.Причина, по которой прямой поиск выполняется быстрее, заключается в том, что любой другой тест также выполняет точно такой же поиск поверх условной проверки.И нет никакой реальной причины писать код вроде:

if (t == 'e') c['e'];

Это очевидное нарушение DRY (не повторяйте себя), и вы не сэкономите время, используя строковый литерал в поиске в качествесодержимое переменной t все еще нужно выбрать для сравнения.

Также

if (c[t]) c[t]();

Так же лениво, как и

c[t] && c[t]();

Почему Safari предоставляет такую ​​противоположностьРезультаты я понятия не имею, так как не логично, что «операция a + операция b <операция a».Следует только отметить, что тестирование производительности в Javascript часто ненадежно, поскольку объект Date ограничен миллисекундами и даже тогда обычно не обеспечивает достаточной точности для полезных результатов. </p>

И, наконец, при прочих равных объектпоиск на никогда не быстрее, чем оператор if / else или switch, и на самом деле может быть на несколько порядков медленнее.Кроме того, разница между if / else и switch должна быть незначительной, если она существует, и, конечно, сильно зависит от конкретного браузера / интерпретатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...