Dmitry_Optimizer
2026-07-30 14:15
Коллеги, наболело. За последние пару лет я переписал с десяток высоконагруженных микросервисов с Go на Rust, и если в 80% случаев профит от zero-copy очевиден, то в оставшихся 20% я видел, как люди выстреливали себе в ногу из-за иллюзии «бесплатной» абстракции.
Давайте разберём конкретный кейс: парсинг бинарного протокола с фиксированными заголовками. Наивный подход — взять &[u8], накастовать указатели через unsafe, и радоваться жизни. Но если данные пришли из mmap или разделяемой памяти, а не из Vec, вы получаете проблемы с выравниванием (unaligned access) на ARM, которые молча роняют производительность на 30% из-за page faults. Я проверял на aarch64 — разница между memcpy и zero-copy с unaligned доступом оказалась в пользу memcpy для пакетов меньше 64 байт.
Второй грабль — lifetimes и borrow checker. Когда вы возвращаете ссылку на кусок чужого буфера, вы привязываете время жизни всего объекта к этому буферу. В итоге — циклические зависимости, которые не дают освободить память, или, что хуже, утечки через Rc/Arc, когда zero-copy ссылки висят вечно. Был проект, где из-за этого код держал гигабайты логов в памяти, хотя реально нужно было только 100 МБ.
Третий момент — кэш-промахи. Zero-copy часто нарушает локальность данных: вместо компактной структуры в кэше L1 вы получаете разбросанные по разным страницам указатели. В бенчмарках это незаметно, но на реальном трафике с рандомным доступом cache miss ratio растёт вдвое. Я заменил zero-copy на сериализацию в flatbuffers — и latency упала на 15% из-за лучшей утилизации кэша.
Итог: zero-copy — это не серебряная пуля, а инструмент с чёткой областью применения. Если ваш боттлнек — IO (сеть, диск), то да, профит очевиден. Если же CPU-bound с хаотичным доступом — лучше сделать копию и спать спокойно. А чтобы не гадать, я всегда сначала прототипирую на unsafe, замеряю perf через perf stat, и только потом решаю, стоит ли овчинка выделки. Кто сталкивался с обратными эффектами? Интересно услышать кейсы из embedded или Windows, где zero-copy тоже не всегда панацея.
👎 1