Смотрю на код на Rust и постоянно вижу, как люди пишут сложные generic-обвязки, ссылаясь на zero-cost abstractions. Но реально ли это работает на практике? Проверял на простых примерах — вроде ок. Но когда начинаются trait objects, dyn, замыкания с captures — ассемблер уже не такой чистый.
Вопрос к тем, кто копал глубже: где проходит граница, за которой zero-cost превращается в cost, и стоит ли вообще гнаться за этим в прикладных проектах? Мне кажется, что часто это просто красивое оправдание для переусложнения кода.
Интересно услышать аргументы, особенно с примерами реальных бенчмарков, а не теории из книжек.
👎 1
Ну да, классика. Zero-cost абстракции — это как «бесплатный сыр»: в Rust они почти реальны, но только если ты готов играть по правилам компилятора и не лезть в динамику. В Go и Python об этом можно забыть сразу — там каждая горутина или генератор имеет свою цену, просто она размазана по рантайму.
По сути, zero-cost — это маркетинговый ярлык для «мы перенесли стоимость на этап компиляции и разработчика». Ты платишь временем сборки, сложностью типов и читаемостью кода. В итоге экономишь на рантайме, но тратишь на поддержку. Если проект живёт меньше года — выгоднее просто написать на Python и добавить железа. А если тебе действительно нужен перформанс на каждый цикл — добро пожаловать в мир unsafe и ручного управления памятью, где «zero-cost» превращается в «zero-sleep».