Почему С++ быстрее многих языков программирования?

Рейтинг: 3Ответов: 3Опубликовано: 06.05.2023

Достаточно интересно полностью понять, почему С++ настолько быстр по сравнению с условным Kotlin, Java или C#.

Вопрос: Расскажите пожалуйста в деталях, почему именно так) Предполагаю, что это благодаря достаточно гибкой работой с памятью, но кажется, что сильно заблуждаюсь)

Ответы

▲ 6Принят

Во, я наверное хорошо смогу ответить, так как являюсь специалистом в C# и .NET

Но перед тем как вникать в суть, запомните основное правило: тормозит не язык, на котором вы написали код или среда выполнения, тормозит сам код, который вы написали.

И главная проблема плохого тормозящего кода в таких средах со сборщиком мусора, как .NET и Java, это отсутствие экспертизы в области поведения той самой машины управления памятью. Хочешь создать 200кк массивов для выполнения задачи - легко, код прост. Просто спавни объекты и ни о чем не думай, а сборщик мусора разберется.

В таких средах, где нет встроенного управления памятью, и надо его писать по большей части самому, приходится разбираться с этим до того как код дописать, потому что иначе будут утечки и прочие неприятности. Когда учишь С++, изначально познаешь базовые тонкости работы с памятью, а многие новички сразу начинают различать malloc и calloc, и осознавать, что выделение высвобождение памяти не бесплатно по времени и требует работы, переиспользуют память и т.д.

Чтобы научиться контролю аллокаций в средах типа .NET, требуется сначала написать много тормознутого кода, и наконец-то встретиться с проблемой низкой производительности или перерасхода памяти лицом к лицу. То есть вникание в управление памятью и суть работы сборщика происходит гораздо позднее. Поэтому при одинаковом объеме обучающих материалов, специалист по C++ узнает про нюансы производительности раньше, чем специалист по C#. И это нормально, это специфика среды, в которой работает код.

Поэтому вопрос "что быстрее, С++ или C#/Java" изначально не имеет смысла. Даже если столкнуть лбами двух супермегаэкспертов C++ и C# - неизвестно, чей код будет быстрее. Напишешь на C++ код, потом начнешь тестировать, на одном сервере победишь C#, на другом в другой архитектуре - проиграешь. Ну потому что JIT во время компиляции знает все тонкости процессора, выполняющего код, а компилятор C++ - не знает, он знает только архитектуру. Есть еще PGO (Profile-Guided Optimization) в CLR (Common Language Runtime/.NET) - великолепная шутка, которая может перекомпилировать с сильными оптимизациями код уже запущенного приложения в зависимости от интенсивности использования некоторых методов в коде (речь про последние версии .NET, но раньше ситуация была хуже). В C++ такого либо нет, либо оно достигается значительно тяжелее, чем в среде с JIT. И еще миллионы нюансов, которые никак не ответят на ваш вопрос однозначно.

И здесь можно повторить вывод, который написан жирным шрифтом выше, в самом начале. А утверждение "С++ быстрее многих языков программирования" по факту не соответствует действительности. Я могу на C# написать код, который будет например применять фильтр к Full HD картинке 2 секунды, а могу потом переписать его так, что станет потом 4мс, а качество машинного кода, который выдает JIT, будет не сильно хуже, чем генерит gcc/clang. Не забывайте, что компиляция байт-кода (или CIL) производится машиной в целом однократно, а затем уже работает только скомпилированная версия. Например вызываете какой-то метод 1000 раз, а компилироваться он будет только однажды. JIT - это не интерпритатор байт-кода, а компилятор.

▲ 2

Большинство языков работают не напрямую. К примеру Java использует JVM, у C# это CLR, а Python с помощью CPython (стандартная реализация) компилируется в байт-код, который затем обрабатывается в "ручную". Это все даёт различные плюсы, но тратит ресурсы. В С/С++ этот этап отсутствует, он на прямую компилируется в машинный код.

Также он даёт возможность работать с памятью на прямую. Это не всегда безопасно, но также влияет на скорость работы.

▲ -2

Это не C++ быстрый, а C быстрый, т.к. проектировался как замена макроассемблеру, с учётом особенностей железа. Пока Вы используете C-подмножество языка C++ - он быстрый, а стоит просто включить в текст стандартные C++ заголовки, как врубается поддержка C++ исключений и всё начинает тормозить.