A/B тестирование производительности
A/B тестирование производительности — контролируемый эксперимент, где часть реальных пользователей получает оптимизированную версию приложения (B), а остальные — исходную (A), с измерением разницы в бизнес-метриках и Core Web Vitals.
Зачем нужно
Оптимизация производительности без измерения влияния на конверсию — слепое улучшение. A/B тест доказывает причинно-следственную связь: снижение LCP на 500ms увеличило добавление в корзину на 7%. Это позволяет приоритизировать оптимизации по реальному ROI.
Где используется
- Тестирование новых алгоритмов сжатия/кодирования изображений
- Сравнение SSR vs CSR по влиянию на конверсию
- Проверка эффекта критического CSS, prefetch, lazy loading
- Сравнение CDN-провайдеров по реальному TTFB
Основной контент
Методология Performance A/B теста
1. Гипотеза → "Переход на AVIF снизит LCP на 20%"
2. Метрика → LCP, конверсия, bounce rate
3. Разделение → 50/50 split по user sessions (не по IP!)
4. Минимум длительность → 1-2 недели для статистической значимости
5. Анализ → Статистическая значимость p < 0.05
Сбор RUM-данных для A/B (Web Vitals API)
import { onLCP, onCLS, onINP } from 'web-vitals';
// Определить вариант при загрузке
const variant = Math.random < 0.5 ? 'control' : 'treatment';
sessionStorage.setItem('ab_variant', variant);
// Применить оптимизацию для treatment
if (variant === 'treatment') {
document.documentElement.classList.add('treatment');
}
// Отправить метрики с вариантом
function sendToAnalytics(metric) {
navigator.sendBeacon('/analytics', JSON.stringify({
name: metric.name,
value: metric.value,
variant,
sessionId: getSessionId,
page: location.pathname,
}));
}
onLCP(sendToAnalytics);
onCLS(sendToAnalytics);
onINP(sendToAnalytics);
Анализ результатов (Node.js)
// Агрегация по вариантам из аналитики
const results = await db.query(`
SELECT
variant,
COUNT(*) as sessions,
percentile_cont(0.75) WITHIN GROUP (ORDER BY lcp) as p75_lcp,
percentile_cont(0.95) WITHIN GROUP (ORDER BY lcp) as p95_lcp,
AVG(converted::int) as conversion_rate
FROM ab_sessions
WHERE experiment = 'avif-images'
AND created_at > NOW - INTERVAL '14 days'
GROUP BY variant
`);
// control: p75_lcp=2400ms, conversion=3.2%
// treatment: p75_lcp=1850ms, conversion=3.9% (+21.8% LCP, +21.9% конверсия)
Инструменты
# Cloudflare Workers A/B (edge split)
# Vercel Edge Config + Middleware
# Feature flags: LaunchDarkly, PostHog, GrowthBook (open source)
# Проверка статистической значимости:
# https://www.evanmiller.org/ab-testing/chi-squared.html
Частые ошибки
- Тест менее 1 недели — недостаточно данных для стат. значимости, эффект "дня недели"
- Разделение по IP вместо по сессиям — пользователь с dynamic IP попадает в оба варианта
- Измерение только WebVitals без бизнес-метрик — производительность ≠ конверсия
- Одновременный запуск нескольких экспериментов — взаимное влияние вариантов
Связанные темы
- _MOC Производительность
- Real User Monitoring (RUM)
- Core Web Vitals -- LCP, FID, CLS
- Synthetic Monitoring