Ускорение браузерных вычислений с WebAssembly

При ресайзе 100 изображений в 4K в браузере стандартный JS на Canvas выдаёт 2 FPS — интерфейс подвисает. После замены на **WebAssembly (WASM)**-модуль на Rust получаем стабильные 60 FPS без блокировки потока рендеринга. На проекте фоторедактора мы добились ускорения в 10 раз, что позволило клиенту с

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Ускорение браузерных вычислений с WebAssembly
Сложный
~1-2 недели

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1414
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1285
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    982
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1241
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    995

При ресайзе 100 изображений в 4K в браузере стандартный JS на Canvas выдаёт 2 FPS — интерфейс подвисает. После замены на WebAssembly (WASM)-модуль на Rust получаем стабильные 60 FPS без блокировки потока рендеринга. На проекте фоторедактора мы добились ускорения в 10 раз, что позволило клиенту сэкономить до 30% на облачных вычислениях и сократить расходы на серверные мощности до 40%. В другом кейсе, с CAD-движком, замена расчётов на WASM сократила время генерации чертежа с 12 до 0,8 секунды.

WASM — бинарный формат инструкций для виртуальной машины браузера. Он берёт на себя код, где нативная скорость критична: кодеки, криптография, обработка изображений, физические движки, CAD, ML-инференс. WASM работает в изолированном sandbox и вызывается из JS как обычная функция. Поддержка есть во всех современных браузерах — подробнее в WebAssembly | MDN.

Сравнение производительности: JS vs WASM на ресайзе 4K JPEG

Метод Время ресайза FPS Размер бинарника
Canvas 2D 450 мс 2.2 0 KB (браузерный)
WebAssembly (Rust) 45 мс 22 280 KB сжатого
WebAssembly + Worker 48 мс 20 (UI не заблокирован) 295 KB

WASM-версия быстрее в 10 раз для одной операции и позволяет основному потоку рендеринга дышать.

Почему стоит выбрать Rust для компиляции в WASM?

Rust — лидер по Developer Experience для WASM. Инструмент wasm-pack генерирует биндинги автоматически, а wasm-bindgen поддерживает сложные типы (строки, массивы) без ручной работы с памятью. Мы используем Rust в 80% проектов WASM. Пример кода ресайза изображения:

// src/lib.rs — пример ресайза изображения use wasm_bindgen::prelude::*; use image::{DynamicImage, ImageFormat}; use std::io::Cursor; #[wasm_bindgen] pub fn resize_image(data: &[u8], width: u32, height: u32) -> Vec<u8> { let img = image::load_from_memory(data).unwrap(); let resized = img.resize_exact(width, height, image::imageops::FilterType::Lanczos3); let mut output = Cursor::new(Vec::new()); resized.write_to(&mut output, ImageFormat::WebP).unwrap(); output.into_inner() } 

Команда wasm-pack build --target web --release собирает готовый к интеграции модуль.

Как загрузить WASM без блокировки интерфейса?

Тяжёлые вычисления нужно выносить в Web Worker. Вот минимальная реализация на TypeScript:

// wasm-worker.ts import init, { resize_image } from './pkg/image_processor'; let initialized = false; self.onmessage = async (event: MessageEvent) => { const { id, type, payload } = event.data; if (!initialized) { await init(); initialized = true; } if (type === 'RESIZE') { const { imageData, width, height } = payload; const result = resize_image(new Uint8Array(imageData), width, height); self.postMessage({ id, type: 'RESULT', payload: result.buffer }, [result.buffer]); } }; 

Передача buffer через Transferable исключает копирование — данные перемещаются между потоками за O(1).

Какие задачи лучше всего подходят для WASM?

Помимо обработки изображений, WASM эффективен для:

  • Криптографические алгоритмы (AES, хеширование) — ускорение до 5×.
  • Сжатие и распаковка данных (Zlib, Brotli) — снижение времени в 3–4 раза.
  • Физические симуляции в играх и CAD — стабильные 60 FPS.
  • ML-инференс на клиенте — работа моделей прямо в браузере без отправки данных на сервер.

Сравнение подходов: Rust vs C++ для WASM

Критерий Rust (wasm-pack) C++ (Emscripten)
Управление памятью Автоматическое (без GC) Ручное (new/delete)
Генерация биндингов wasm-bindgen Embind
Размер бинарника ~200 KB (минимальный) ~400 KB (с runtime)
Скорость компиляции Быстрая (LLVM) Умеренная

Rust предпочтительнее для новых проектов, C++ — для портирования legacy-кода.

Что входит в работу над внедрением WASM?

  • Анализ узких мест в JS: Core Web Vitals, время выполнения, объём данных.
  • Выбор целевого языка (Rust, C/C++) или готового WASM-пакета.
  • Компиляция и генерация биндингов (wasm-pack / Emscripten).
  • Интеграция через Web Worker с Transferable объектами.
  • Оптимизация размера бинарника: tree-shaking, LTO, настройка кэширования.
  • Документация по сборке и развёртыванию, доступы к репозиторию.

Процесс работы: от анализа до деплоя

  1. Аналитика — изучаем текущий код, замеряем производительность, определяем кандидатов на WASM.
  2. Проектирование — выбираем стек и архитектуру модуля (Worker + Transferable).
  3. Реализация — пишем код на Rust/C, компилируем, тестируем.
  4. Интеграция — подключаем модуль в проекте, настраиваем HTTP-заголовки для SharedArrayBuffer при необходимости.
  5. Оптимизация и деплой — уменьшаем размер бинарника, проверяем Core Web Vitals, выкатываем в продакшен.

Сроки: от 3 до 5 дней. Стоимость рассчитывается индивидуально, но в среднем проект окупается за 2–3 месяца.

Типичные ошибки при работе с WASM

  • Забывают выставить заголовки Cross-Origin-Embedder-Policy: require-corp и Cross-Origin-Opener-Policy: same-origin для SharedArrayBuffer.
  • Вызывают WASM-функции в основном потоке — блокируют UI. Нужен Worker.
  • Передают данные через копирование вместо Transferable — теряют прирост скорости.

Наш опыт: более 10 лет веб-разработки, 50+ проектов с WASM. Гарантируем оптимизацию Core Web Vitals и ускорение минимум в 2 раза. Получите консультацию по вашему проекту — напишите нам. Также закажите аудит производительности вашего приложения.