v2.1Концепции
Производительность
Целевые бюджеты, приёмы без лишних аллокаций и способ честно измерить разбор на своих данных.
Цифры вымышлены
Сверло — демонстрационный продукт, поэтому таблица ниже содержит целевые значения проекта, а не результаты измерений. Метод измерения в конце страницы настоящий и подходит для любого разборщика.
Бюджеты#
| Показатель | Цель | Почему |
|---|---|---|
| Память при разборе | не больше 50 МБ при любом размере файла | Потоковая обработка, лимит maxLineLength |
| Время на строку nginx-combined | порядка единиц микросекунд | Один проход автомата без отката |
Задержка tail | меньше 100 мс от записи до записи в вывод | Порог, ниже которого человек не замечает паузы1 |
| Размер пакета | меньше 40 КБ в gzip | Нет зависимостей |
Приёмы#
- Не создавайте
Dateбез необходимости. Если запрос не трогаетts, время разбирается лениво при первом обращении. - Не копируйте строку. Поля вырезаются через
slice, а в движках V8 это ссылка на исходную строку; поэтомуrawпочти бесплатен. - Сначала фильтр, потом запись.
createTransform({ query })отбрасывает ненужное до созданияfields. - Один разборщик на источник. Повторная компиляция шаблона на каждую строку убивает всё остальное.
Как измерить у себя#
- Возьмите реальный файл хотя бы в сотню мегабайт: на маленьком выигрыш прячется за прогревом JIT.
- Прогоните разбор три раза подряд и смотрите на второй и третий: первый включает прогрев.
- Измеряйте пропускную способность в МБ/с, а не время на строку: строки разной длины дают несравнимые цифры.
- Следите за памятью через
process.memoryUsage().rssна всём протяжении, а не только в конце.
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`);Если цифры у вас сильно ниже ожидаемых, сначала проверьте долю ошибок: разбор неподходящего формата стоит дороже успешного.
Сноски
- Порог около 100 мс — общепринятая оценка восприятия отклика интерфейса, а не свойство Сверла. ↩