Как делают различное влияние проектов оптимизации JavaScript производительность DOM?

Разница между split и partition заключается в том, что partition будет разбиваться только на первое вхождение данного разделителя и также будет возвращать сам этот разделитель. 1113]

split вернет массив строк, отделяя строку на основе расположения данного разделителя и не включая разделитель в массиве.

Возьмите строку "a+b+c+d".

"a+b+c+d".split("+") # (= ["a", "b", "c", "d"])
"a+b+c+d".partition("+") # (= ("a", "+", "b+c+d"))

Вы можете использовать s[7:], только когда знаете, что подчеркивание точно в позиции 6. Это также вернет все после подчеркивания, так что давайте предположим, что мы хотим разделить предыдущую строку на основе знак «+», зная, что плюс находится в позиции 1, мы будем использовать обозначение массива:

"a+b+c+d"[2:] # (= "b+c+d")

Вы можете объединить это с find :

i = "a+b+c+d".find("+")
"a+b+c+d"[i+1:] # ( = "b+c+d")

5
задан Alan Storm 2 January 2009 в 05:19
поделиться

2 ответа

Выполнение чистых операций DOM (getElementById/Tagname/Selector, nextChild, и т.д.) незатронуто, как они уже находятся в чистом C++.

То, как улучшения механизма JS произведут производительность, действительно зависит до степени от конкретных методов, используемых для повышений производительности, а также производительности DOM-> мост JS.

Примером первого является зависимость TraceMonkey от всего вызова того, чтобы быть к функциям JS. Поскольку трассировка эффективно встраивает путь выполнения любая точка, где JS поражает код, который не может быть встроен (собственный код, истинная полиморфная рекурсия, обработчики исключений), трассировка прерывается, и выполнение отступает к интерпретатору. Разработчики ТМ делают довольно большую работу для улучшения объема кода, который может быть прослежен (включая обработку полиморфной рекурсии) однако реалистично прослеживающий через вызовы до произвольных собственных функций (например, DOM) не выполнимо. По этой причине я полагаю, что они смотрят на реализацию большего количества DOM в JS (или по крайней мере дружественным способом JS). Тем не менее то, когда код является прослеживаемым ТМ, может сделать исключительно хорошее задание, поскольку это может понизить большинство "объектов" к более эффективным и/или собственным эквивалентам (например, использовать машину ints вместо реализации Числа JS).

JavaScriptCore (который является, где Экстремальное значение SquirrelFish живет) и V8 имеют более аналогичный подход в этом они оба JIT весь код JS сразу и производят код, который является более спекулятивным (например, если Вы делаете a*b они генерируют код, который принимает a и b числа, и отступает к исключительно медленному коду, если они не). Это обладает многими преимуществами по трассировке, а именно, что Вы можете монета в пять центов весь код, независимо относительно того, звонит ли это, собственный код / выдает исключения, и т.д., что означает, что единственный вызов DOM не уничтожит производительность. Оборотная сторона - то, что весь код является спекулятивным - ТМ встроит вызовы к Math.floor, и т.д., но лучший JSC/V8 может сделать, было бы эквивалентно a=Math.floor(0.5) -> a=(Math.floor == realFloor) ? inline : Math.floor(0.5) это имеет затраты и в производительности и в использовании памяти, это также не особенно выполнимо. Причиной этого является честная компиляция, тогда как ТМ только код МОНЕТ В ПЯТЬ ЦЕНТОВ после того, как это работало (и так знает точно, какая функция была вызвана) ОАО и V8 не имеет никакого реального основания, чтобы сделать такое предположение и в основном иметь для предположения (и в настоящее время никакой попытки это). Одна вещь, которую V8 и ОАО делают, чтобы попытаться компенсировать эту проблему, состоит в том, чтобы отследить то, что они видели в прошлом и включают, это в путь выполнения, оба использует комбинацию методов, чтобы сделать это кэширование, в особенно горячих случаях они переписывают небольшие части потока команд, и в других случаях они держатся в стороне от кэшей полосы. Вообще говоря, если у Вас есть код, который идет

a.x * a.y

V8 и ОАО проверят 'неявный тип'/'Structure' дважды - однажды для каждого доступа и затем проверят это a.x и a.y оба числа, тогда как ТМ сгенерирует код, который проверяет тип a только однажды, и может (при прочих равных условиях) просто умножиться a.x и a.y не проверяя, что они - числа.

При рассмотрении чистой скорости выполнения в настоящее время существует что-то вроде ассортимента, поскольку каждый механизм, действительно кажется, добивается большего успеха в определенных задачах, чем другие - победы TraceMonkey во многих чистых тестах математики, победы V8 в в большой степени динамических случаях, победы ОАО, если существует соединение. Конечно, в то время как это правда сегодня это не может быть завтра, когда мы все упорно работаем для улучшения производительности.

Другой проблемой, которую я упомянул, был DOM <-> JS привязка стоимости - это может на самом деле играть очень значительную роль в веб-производительности, лучшим примером этого является Safari 3.1/2 по сравнению с Chrome в сравнительном тесте Dromaeo. Chrome базируется прочь Safari 3.1/2 ответвление WebKit, таким образом, довольно безопасно принять подобную производительность DOM (различие в компиляторе могло вызвать определенную степень различия). В этом Safari сравнительного теста 3.1/2 на самом деле бьет Chrome несмотря на наличие механизма JS, который ясно намного намного медленнее, это происходит в основном из-за более эффективной привязки между JSC/WebCore (dom/rendering/etc WebKit) и V8/WebCore

В настоящее время рассмотрение привязки ТМ DOM кажется несправедливым, поскольку они не завершили всю работу, которую они хотят сделать (увы), таким образом, они просто возвращаются к интерпретатору :-(

..

Errmmm, который продолжал несколько дольше, чем предназначенный, так короткий ответ на исходный вопрос, "он зависит" :D

13
ответ дан 18 December 2019 в 09:54
поделиться

Они - чистый JavaScript. Если конкретный вызов метода DOM не будет реализован в JS, они будут иметь мало эффекта (чтобы не сказать, что не было работы, сделанной при сокращении издержек таких вызовов однако).

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

4
ответ дан 18 December 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: