Сжатие производительности из v8

Есть ли хорошие учебники о том, как быстро писать эффективный код для v8 (в частности, для node.js)?

Какие структуры следует избегать использовать? Каковы идиомы, которые хорошо оптимизируют v8?

Ответы

Ответ 1

Из моего опыта:

  • Он делает вложение
  • Накладные расходы на функционирование минимальны (inlining)
  • Что дорого стоит передать огромные строки для функций, так как они должны быть скопированы, и из моего опыта V8 не всегда настолько умен, насколько это возможно в этом случае
  • Сфера поиска дорогая (сюрприз)
  • Не делайте трюков, например. У меня есть двоичный кодер для JS Object, который выдает некоторую дополнительную производительность с перемещением битов там (вместо Math.floor) последним Crankshaft (да alpha, но все же) запускает код на 30% медленнее
  • Не используйте магию. eval, arguments.callee и т.д. Они почти убивают любую оптимизацию, поскольку код больше не может быть встроен
  • Некоторые из новых материалов ES5, например. .bind() на самом деле медленнее в V8 в данный момент
  • Как-то new Object() и new Array() в данный момент немного быстрее (MICROoptimization, если вы не пишете сумасшедший кодер с {} и [])

Мои правила:

  • Напишите хороший код
  • Записать рабочий код
  • Напиши код, который работает в строгом режиме (поддержка по-прежнему чтобы приземлиться, но когда дальнейшая оптимизация может быть применена V8)

Если вы эксперт JS и уже применяете все хорошие практики к своему коду, вряд ли что-нибудь вы можете сделать для повышения производительности.

Если вы столкнулись с проблемами производительности:

  • Проверить их
  • Измените код/​​алгоритм
  • И в крайнем случае: напишите расширение С++ (и следите за каждой фиксацией на ry/ node на GitHub, так как никто не заботится о том, что некоторые внутренние изменения нарушают вашу сборку)

Ответ 3

Понимание V8 - это набор слайдов из nodecamp.eu и дает очень интересные советы. В частности, я нашел заметки о том, что полезно избегать "словарного режима", т.е. Помогает, если вы сохраняете "фигуру" объектов постоянными и не добавляете к ним произвольные свойства.

Вы также должны запустить node с помощью --crankshaft --trace-opt --trace-bailout (--crankshaft требуется только на 64-разрядных платформах, например OS X), чтобы узнать, "Vailing" для V8 "Jailing" на JIT для определенных функций. Существует тонна других параметров трассировки, включая --trace-gc и различные другие трассировки GC, которые могут быть полезны для оптимизации.

Сообщите мне, есть ли у вас какие-либо конкретные вопросы о слайдах выше, поскольку они немного кратки.:-) Они не мои, но я провел некоторое исследование в областях, которые они покрывают.