Сравнение

Base64 против обычных файлов: что быстрее и когда

Один и тот же логотип можно подключить двумя способами: ссылкой на файл logo.png или зашитой в код строкой data:image/png;base64,…. Кажется мелочью, но на скорости сайта эти варианты сказываются по-разному. Сравниваем их честно — по размеру, кешу и числу запросов — и даём простой ответ, что выбрать.

Зелёный поток цифр в стиле «Матрицы» — данные в виде потока
Файл или строка — два способа доставить одни и те же байты картинки. Фото: Pexels

Два способа подключить картинку

Важно сразу понять: это не два разных формата картинки. И в файле, и в Base64-строке лежат одни и те же байты изображения. Отличается только способ доставки. Файл — это отдельный ресурс на сервере, за которым браузер идёт по ссылке. Base64 — это те же данные, переписанные текстом и вставленные прямо в HTML или CSS.

Если хочется освежить, как именно работает кодирование, загляните в статью «Что такое Base64». А здесь устроим честное сравнение двух подходов по трём ключевым параметрам.

<!-- Способ 1: ссылка на файл -->
<img src="/img/logo.png">

<!-- Способ 2: те же данные строкой Base64 -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">

Спойлер

Универсального победителя нет. Файл выигрывает по размеру и кешу, Base64 — по числу запросов на мелочёвке. Поэтому вопрос не «что лучше вообще», а «что лучше для этой конкретной картинки».

Раунд 1: размер — побеждает файл

Здесь всё однозначно. Base64 не сжимает данные, он лишь переписывает их текстом, и из-за схемы «3 байта → 4 символа» строка получается примерно на 33% больше исходного файла. Картинка на 9 КБ в виде Base64 займёт около 12 КБ.

То есть по чистому весу отдельный файл всегда легче. И чем крупнее изображение, тем заметнее эта разница в абсолютных килобайтах.

Здесь стоит развеять частое заблуждение: «Сервер ведь умеет сжимать данные перед отправкой (это называется gzip), значит, разницы нет». Сжатие действительно частично отыгрывает раздувание, но не полностью — закодированный текст всё равно остаётся тяжелее сжатого обычного файла, да и распаковывать его компьютеру приходится дополнительно. Так что считать Base64 «бесплатным» неправильно.

Цветной код крупным планом на тёмном экране — данные и их представление
Те же байты, два представления: компактный файл или текстовая строка на треть длиннее. Фото: Pexels

Раунд 2: число запросов — побеждает Base64

А вот тут у Base64 единственный, но важный козырь. Отдельный файл требует отдельного HTTP-запроса: браузеру нужно установить соединение и забрать ресурс. Base64-картинка приходит вместе с HTML или CSS, так что лишнего запроса нет вовсе.

На заре веба, во времена HTTP/1.1, это был решающий фактор: десятки мелких файлов реально тормозили загрузку. Но современные HTTP/2 и HTTP/3 передают множество файлов по одному соединению почти без накладных расходов — и преимущество Base64 здесь сильно поблёкло. Подробнее об этом — в статье «Base64-картинки в вебе».

Нюанс

Выигрыш в запросах имеет смысл только для очень мелких картинок. Сэкономить один запрос ценой лишних 33% размера выгодно на иконке в 1 КБ и абсолютно невыгодно на фото в 500 КБ.

Раунд 3: кеширование — уверенно побеждает файл

Это решающий раунд. Отдельный файл браузер скачивает один раз и потом берёт из кеша — на других страницах сайта и при повторных визитах. Одна иконка, используемая на 20 страницах, загружается ровно один раз.

Base64-строка вшита в HTML или CSS, поэтому отдельного кеша у неё нет: она грузится заново вместе со страницей при каждом запросе. Та же иконка на 20 страницах — это 20 загрузок одних и тех же данных. На сайте с повторными визитами файл выигрывает с огромным отрывом.

Файл скачивается один раз и живёт в кеше. Base64-строка платит за себя при каждой загрузке страницы.
Коридор из светящихся цифр — поток повторно загружаемых данных
Без кеша встроенные данные приходится «нести» заново на каждой странице. Фото: Pexels

Сводная таблица

Соберём всё в одном месте:

КритерийBase64Обычный файл
Размер данных+33%меньше
Отдельный HTTP-запросне нуженнужен
Кешируется отдельноНетДа
Появляется мгновенноДапосле загрузки
Лёгкая замена/правкаСложноПросто
Подходит для крупных фотоНетДа
+33%размер у Base64
−1запрос у Base64
загрузка файла из кеша

Что выбрать на практике

Итог простой и без воды:

  • Обычный файл — по умолчанию. Он меньше, кешируется и легко обновляется. Это правильный выбор для подавляющего большинства картинок: фото, баннеров, иллюстраций, любых изображений, которые встречаются больше чем на одной странице.
  • Base64 — точечно. Для крошечных иконок до ~5 КБ, которые нужны мгновенно; для критического CSS; для логотипов в HTML-письмах. Здесь экономия запроса и гарантированное появление перевешивают рост размера.

Это не «или-или», а два инструмента под разные задачи. Какие именно сценарии оправдывают Base64, мы разбираем в статье «Base64 в CSS и email».

Маленький пример из жизни

Допустим, у вас интернет-магазин. Логотип в шапке виден на каждой странице — значит, его место отдельный файл: кешируется один раз и работает на всём сайте. А вот крошечная иконка-галочка в кнопке «Добавлено в корзину», которая должна вспыхнуть мгновенно в момент клика, — отличный кандидат на Base64 в CSS: один сэкономленный запрос важнее, чем лишний килобайт. Фотографии товаров, конечно, всегда отдельные файлы — они большие, кешируются и часто переиспользуются в каталоге.

Видите логику? Решение принимается не «вообще», а для каждой картинки отдельно — по её размеру, частоте показа и тому, насколько срочно она нужна на экране.

Нужно превратить картинку в Base64?

Закодируйте PNG в строку онлайн или сделайте обратное — наш конвертер работает в обе стороны, прямо в браузере и без установки.

Конвертировать PNG в Base64

Обратное преобразование — Base64 → PNG, а полный список конвертеров есть на странице всех форматов.

Обычный файл. Base64 не сжимает данные, а только переписывает их текстом, из-за чего строка получается примерно на 33% больше исходного файла. То есть по чистому размеру файл всегда выигрывает.
Ради одного: убрать отдельный HTTP-запрос и встроить картинку прямо в текст — в HTML, CSS, JSON или письмо. Это удобно для крошечных иконок, критического CSS и почты. Во всех остальных случаях отдельный файл практичнее.
Отдельный файл — с большим отрывом. Браузер скачивает его один раз и переиспользует на всех страницах и при повторных заходах. Base64-строка вшита в HTML или CSS и грузится заново при каждом запросе страницы, никакого отдельного кеша у неё нет.
Да, сильно. Если одна иконка нужна на многих страницах, файл кешируется один раз и побеждает. Если набор уникальных иконок виден лишь на одном экране и нужен сразу, встраивание в Base64 экономит несколько запросов.
По умолчанию используйте обычные файлы: они меньше и кешируются. Base64 берите точечно — для мелких иконок до 5 КБ, критического CSS и HTML-писем. Это не «или-или», а два инструмента под разные задачи.