---
sidebar_label: "Оптимизация производительности"
title: "Производительность - CyberGo html | оптимизация"
description: "Оптимизация производительности CyberGo html: переиспользование Processor, стратегия кэша, параллелизм пакетов, размеры ввода и тайм-ауты."
sidebar_position: 1
---

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

## Повторное использование 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
```
