Значительно более высокая производительность в React при профилировании с помощью Chrome - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над планировщиком gant-ish, используя React .Планировщик состоит из SVG, которые генерируются данными.Данные управляются событиями мыши и бизнес-логикой.

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

Однако я сразу заметил, что производительность значительно улучшилась , пока я работал с профилировщиком!

Это не имеет большого смысла для меня ввсе, поскольку обычно профилировщики должны снижать производительность.

Вот видео, записанное со скоростью 60 кадров в секунду со счетчиком кадров Chrome с профилированием кода и без него.

КакВы можете увидеть скачок с 9fps без профилировщика до 40fps с запущенным профилировщиком.

У меня есть ощущение, что оно связано с частотой mouseevent , но Google покане сильно помогло (события перемещения мыши - это поток RxJs, на который подписан планировщик).

Есть идеи?

Снимки результатов профилировщика:
Уменьшено
Zoom-out to show chrome renders
Увеличено Zoom-in to show an individual code loop
"BubbleCopy" и один справа сделаны мной.ForceUpdate () вызывается вручную в конце каждого цикла , если перемещение мыши вызывает изменение состояния.
( Я намеренно решил сделать это, используя изменения setState или prop, поскольку яМне нужно менять состояние чаще, чем я требую полного повторного рендеринга и более глубокой структуры объекта.Кроме того, в дальнейшем тестировании я разделил рендеринг, который происходит после заданного периода, я разделил события мыши, чтобы опрашивать положение мыши послеустановленный период, и я изменил эти периоды на совместное / кратное / случайное, но безрезультатно. )

Дополнительные примечания. Все расширения Chrome были отключены в этом тесте.

EDIT: тестирование в различных браузерах:

  1. Chrome - профилирование повышает производительность
  2. Edge - профилирование улучшает производительность
  3. Internet Explorer - Lol.
  4. Firefox - Профилирование повышает производительность, но базовая производительность в целом выше.

ОБНОВЛЕНИЕ: Проблемы с производительностью были вызваны использованием JSON.parse (JSON.stringify (bubble)) для глубокогоСкопируйте «пузыри».Изменение этой функции на функцию recursiveDeepCopy значительно повысило производительность.
Это не объясняет, почему профилирование кода ускорило процесс, и не объясняет, почему у firefox не было проблем с производительностью, но, надеюсь, кто-то саналогичная проблема в будущем столкнется с подобным исправлением.
Пожалуйста, прокомментируйте, если кто-нибудь когда-нибудь выяснит это.

...