2009-04-14 4 views
6

Можете ли вы, ребята, помочь мне определить разницу в производительности каждого из этих операторов ? Какой из них вы бы использовали?Заявление о работе с JavaScript

  1. Создание нового массива с помощью

    - var new_list = new Array(); or 
    - var new_list = [] 
    
  2. прилагая элемент, используя

    • толчок ('а')
    • new_list [I]; (Если я знаю длину)
  3. оператор троичного или если() {} Else() {}

  4. Попытка сделать ISODD функцию, которая быстрее
    (! (Is_even)) или (х% 2! = 0)

  5. Еогеасп или нормальной итерации

еще один

  1. a = b = 3; или b = 3; а = Ь;

[редактировать: Im, создание математической библиотеки. Так что любые обсуждения в области хакеров приветствуются :)]

Спасибо за помощь.

+0

Я предпочитаю использовать 'var myArray = [];' потому что это проще ... –

ответ

4

Характеристики характеристик для всех браузеров (особенно на уровне отдельных функций библиотеки) могут сильно различаться, поэтому трудно дать осмысленные действительно содержательные ответы на эти вопросы.

Anyhoo, просто глядя на быстрых Js двигателей (так Nitro, TraceMonkey и V8)

  1. [ ] будет быстрее, чем new Array - new Array превращается в следующую логику

    1. cons = искать свойство «Array», если оно не может быть найдено, выбросить исключение
    2. Проверьте, есть ли cons может быть использован в качестве конструктора, если: не сгенерирует исключение
    3. thisVal = среда создает новый объект непосредственно
    4. res = результат вызова cons прохождения thisVal в качестве значения для this - которая требует логики, чтобы различать функции JS от стандартных функций времени выполнения (при условии, что стандартные функции времени выполнения не реализованы в JS, что является обычным делом). В этом случае Array является нативным конструктором, который будет создавать и возвращать новый объект массива времени выполнения.
    5. if res is undefined or null then Конечный результат: thisVal иначе конечный результат: res. В случае вызова Array новый объект массива будет возвращен и thisVal будет выброшен

    [ ] просто говорит двигателю JS непосредственно создать новый объект массива во время выполнения сразу же без дополнительной логики. Это означает, что new Array имеет большое количество дополнительной (не очень дешевой) логики и выполняет и лишнее ненужное выделение объектов.

  2. newlist[newlist.length] = ... быстрее (особенно если NewList не разреженный массив), но толчок достаточно общий для меня ожидать разработчики двигателя поставить совсем немного усилий, повышение производительности, так это может изменения во время.

  3. Если у вас есть достаточно плотный цикл может быть очень небольшой выигрыш в тройном оператора, но возможно, что это двигатель недостаток в Trival случае a = b ? c : d против if (b) a = c; else a = d

  4. Просто вызов накладных расходов функции в одиночку будет карлик стоимости более или менее любой оператора JS, по крайней мере, в здравых случаях (например, вы выполняете арифметические операции над числами, а не объектами)

  5. синтаксис foreach еще не стандартизирован, но его окончательный performane будет зависеть на большом количестве деталей; Часто семантика JS приводит к тому, что эффективные выглядящие утверждения менее эффективны - например. for (var i in array) ... значительно медленнее, чем for (var i = 0; i < array.length; i++) ..., поскольку семантика JS требует перечисления in, чтобы создать список всех свойств объекта (включая цепочку прототипов) и , а затем, чтобы убедиться, что каждое свойство все еще находится на объекте перед его отправкой через петлю. О, и свойства должны быть преобразованы из целых чисел (в любом случае массива) в строки, что требует времени и памяти.

4

Я предлагаю вам код простого сценария, как:

for(var i = 0; i < 1000; i++){ 
    // Test your code here. 
} 

Вы можете эталонное все, что вы хотите, таким образом, возможно добавлением функции хронографа до и после for заявления, чтобы быть более точными.

Конечно, вам нужно будет настроить верхний предел (1000 в этом примере) в зависимости от характера ваших операций - для некоторых потребуется больше итераций, а другие - меньше.

+0

Я делал это раньше, и у меня есть несколько советов. Во-первых, проверьте в нескольких браузерах, так как они имеют разные JS-движки. Во-вторых, вам понадобятся более 1000 итераций, чтобы увидеть какие-либо результаты. И в-третьих, вам придется отключить предупреждения скриптов в браузерах, таких как IE. –

+0

Кроме того, каждый браузер отслеживает время по-разному (неправильно). Например, я слышал, что бывают случаи, когда IE будет игнорировать времена менее 15 мс. –

3
  1. Оба являются собственными конструкторами, вероятно, никакой разницы.
  2. толчок быстрее, он отображает непосредственно к родным, где, как [] является оценочным
  3. Вероятно, не большая разница, но технически, они не делают то же самое, так что это не яблоки с яблоками
  4. x% 2, пропускает вызов функции, который относительно медленный
  5. Я слышал, хотя не могу найти ссылку на данный момент, что итерация быстрее, чем foreach, что было удивительно для меня.

Edit: На # 5, я считаю, что причина связана с this, в этом Еогеаспе заказанного вперед, что требует инкрементор рассчитывать вперед, в то время как для петель никогда так бесконечно быстрее, когда они работают в обратном направлении:

for(var i=a.length;i>-1;i--) { 
    // do whatever 
} 

выше немного быстрее, чем:

for(var i=0;i<a.length;i++) { 
    // do whatever 
} 
+0

Вы должны быть как javascript ninja. Номер 5 является самым шокирующим. есть ли какой-либо другой взлом производительности, который вы предлагаете. – unj2

+0

На самом деле, это довольно просто, почему вам нужно оценить a.length для каждой итерации, тогда как с первой вы только возьмете ее за начальный проход и тест против нуля. – cgp

+1

A для №5 есть еще одна альтернатива, основанная на вашем первом примере: var l = data.length; for (var i = 0; i

1

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

5

Я всегда предполагал, что поскольку (x & 1) является побитовой операцией, это был бы самый быстрый способ проверить четные/нечетные числа, а не проверять оставшуюся часть номера.

1

Вы можете быть заинтересованы в this question и ответы на него

+0

Ха-ха, я подумал «ох, что может быть интересно», а затем обнаружил, что я был лучшим ответом: - / – olliej

Смежные вопросы