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 без бизнес-метрик — производительность ≠ конверсия
  • Одновременный запуск нескольких экспериментов — взаимное влияние вариантов

Связанные темы

Ресурсы