Перейти к содержимому
Разделы
ЯзыкRUEN

v2.1Концепции

Производительность

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

Цифры вымышлены

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

Бюджеты#

ПоказательЦельПочему
Память при разборене больше 50 МБ при любом размере файлаПотоковая обработка, лимит maxLineLength
Время на строку nginx-combinedпорядка единиц микросекундОдин проход автомата без отката
Задержка tailменьше 100 мс от записи до записи в выводПорог, ниже которого человек не замечает паузы1
Размер пакетаменьше 40 КБ в gzipНет зависимостей

Приёмы#

  • Не создавайте Date без необходимости. Если запрос не трогает ts, время разбирается лениво при первом обращении.
  • Не копируйте строку. Поля вырезаются через slice, а в движках V8 это ссылка на исходную строку; поэтому raw почти бесплатен.
  • Сначала фильтр, потом запись. createTransform({ query }) отбрасывает ненужное до создания fields.
  • Один разборщик на источник. Повторная компиляция шаблона на каждую строку убивает всё остальное.

Как измерить у себя#

  1. Возьмите реальный файл хотя бы в сотню мегабайт: на маленьком выигрыш прячется за прогревом JIT.
  2. Прогоните разбор три раза подряд и смотрите на второй и третий: первый включает прогрев.
  3. Измеряйте пропускную способность в МБ/с, а не время на строку: строки разной длины дают несравнимые цифры.
  4. Следите за памятью через process.memoryUsage().rss на всём протяжении, а не только в конце.
js
const t0 = process.hrtime.bigint();
let bytes = 0, n = 0;
for await (const rec of parser.stream(createReadStream(file))) { bytes += rec.raw.length; n++; }
const sec = Number(process.hrtime.bigint() - t0) / 1e9;
console.log(`${(bytes / 1e6 / sec).toFixed(1)} MB/s, ${n} records, rss ${(process.memoryUsage().rss / 1e6) | 0} MB`);

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

Сноски

  1. Порог около 100 мс — общепринятая оценка восприятия отклика интерфейса, а не свойство Сверла. ↩

Обновлено: