Skip to content

Оптимизация производительности

Повторное использование Processor

Для высокочастотных вызовов следует использовать экземпляр Processor вместо функций пакета:

go
// Рекомендуется: повторное использование Processor
p, _ := html.New(html.DefaultConfig())
defer p.Close()

for _, page := range pages {
    result, _ := p.Extract(page)
    // Кэш, детекторы кодировок и другие ресурсы повторно используются
}

// Не рекомендуется: создание нового Processor при каждом вызове
for _, page := range pages {
    result, _ := html.Extract(page) // Каждый раз через Pool
}

Стратегия кэширования

Processor имеет встроенный кэш, одинаковый ввод не обрабатывается повторно:

go
cfg := html.DefaultConfig()
cfg.MaxCacheEntries = 5000     // Увеличенный кэш
cfg.CacheTTL = 10 * time.Minute // Настройка под сценарий
cfg.CacheCleanup = time.Minute   // Более частая очистка

Мониторинг попаданий в кэш:

go
stats := p.GetStatistics()
hitRate := float64(stats.CacheHits) / float64(stats.CacheHits+stats.CacheMisses)
fmt.Printf("Процент попаданий в кэш: %.2f%%\n", hitRate*100)

Пакетная обработка

Пакетная обработка автоматически выполняется параллельно, что эффективнее последовательной обработки:

go
// Рекомендуется: пакетная обработка
batch := p.ExtractBatch(pages)

// Не рекомендуется: последовательная обработка в цикле
for _, page := range pages {
    p.Extract(page) // Последовательно
}

Настройка размера пула воркеров под количество ядер CPU:

go
// WorkerPoolSize имеет верхний предел 256; на многоядерных машинах необходимо ограничить
if n := runtime.NumCPU(); n > 256 {
    n = 256
}
cfg.WorkerPoolSize = n

Управление вводом

  • Уменьшите MaxInputSize, чтобы избежать обработки слишком больших документов
  • Используйте TextOnlyConfig() для пропуска ненужного извлечения медиа
  • Отключите ненужные опции Preserve*
go
// TextOnlyConfig уже отключает сохранение всех медиа, дополнительная настройка не требуется
cfg := html.TextOnlyConfig()

// Можно дополнительно отключить распознавание статей для повышения производительности
cfg.ExtractArticle = false

Настройка тайм-аутов

Устанавливайте разумные тайм-ауты для предотвращения блокировки медленными запросами:

go
cfg.ProcessingTimeout = 10 * time.Second