2017-02-19 18 views
0

Стоит ли хранить значения this.key в переменных?this.key vs variable performace

Может ли это повлиять на скорость при допущении, что я должен выполнять эту операцию в каждом кадре?

Простой пример:

class Vector3 { 
    constructor(X = 0, Y = 0, Z = 0) { 
     this.X = X 
     this.Y = Y 
     this.Z = Z 
    } 
    toVector2() { 
     return new Vector2(
      (this.Y - this.X) * COS27, 
      -((this.Y + this.X) * SIN27 + this.Z) 
     ) 
    } 
} 

против

class Vector3 { 
    constructor(X = 0, Y = 0, Z = 0) { 
     this.X = X 
     this.Y = Y 
     this.Z = Z 
    } 
    toVector2() { 
     const {X, Y, Z} = this 
     return new Vector2(
      (Y - X) * COS27, 
      -((Y + X) * SIN27 + Z) 
     ) 
    } 
} 

Какой из них является более эффективным? Может ли сбор мусора повлиять на производительность здесь?

+0

Напишите тестовый пример в jsperf и просмотрите его самостоятельно. – sabithpocker

+1

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

+0

Назначение деструктуризации ES6 все еще медленнее (до 100x) в большинстве браузеров/транспилеров, чем прямой доступ к свойствам, см. [Six-speed] (https://kpdecker.github.io/six-speed/). – wOxxOm

ответ

1

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

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

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

Единственная причина, по которой объявить локальные переменные, как вы это делали во втором случае, для удобства чтения и ясности.

2

Это очень микро-оптимизация, если только у вас нет узкого места в доступе к объекту. Однако, просто глядя на то, что происходит:

1.) Прямой доступ к собственности:

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

2.) Назначение местных жителей:

При назначении к локальным переменным, вы делаете поиск один раз, и работать с переменными в локальной области видимости, позже, который (должен быть) быстрее.

Вывод:

Второй вариант был бы более «эффективным», и если это важно для вас, гораздо более удобным для чтения, на мой взгляд. Кроме того, если вы повторно обращаетесь к тем же свойствам, имеет смысл сохранить их в локальных сетях - избавится от кучи повторения и с синтаксисом деструктурирования, на который действительно приятно смотреть.

+0

Спасибо за объяснение :), его также более пригодный для повторного использования. Я даже забыл про целую цепочку прототипов, и теперь я абсолютно уверен, что должен хранить эти значения в varibles. –

+0

@MaciejKozieja Destructuring был одним из лучших, что случилось с js, на мой взгляд. Проверьте все его обычаи, если вы заинтересованы! Он также делает объекты конфигурации более чистыми! –

+0

Я знаю об этом, и я использую его в своем коде –