Оптимизация производительности
Повторное использование 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