Я C ++ і розробник C #. Я розробляв програми C # з першої бета-версії .NET Framework і мав більше 20 років досвіду у розробці програм C ++. По-перше, код С # НІКОЛИ не буде швидшим, ніж додаток С ++, але я не буду довго обговорювати керований код, як він працює, рівень взаємодії, внутрішні елементи управління пам'яттю, систему динамічного типу та збирач сміття. Тим не менше, дозвольте продовжити, сказавши, що перелічені тут контрольні показники дають НЕПРАВИЛЬНІ результати.
Поясню: перше, що нам потрібно врахувати, це компілятор JIT для C # (.NET Framework 4). Тепер JIT виробляє власний код для центрального процесора, використовуючи різні алгоритми оптимізації (які, як правило, більш агресивні, ніж оптимізатор за замовчуванням C ++, який постачається з Visual Studio), і набір команд, що використовується компілятором .NET JIT, є більш точним відображенням фактичного процесора на машині, щоб можна було зробити певні заміни в машинному коді, щоб зменшити тактові цикли та покращити частоту потрапляння в кеш конвеєра процесора та провести подальші оптимізації гіперпотоків, такі як переупорядкування інструкцій та вдосконалення, пов'язані з прогнозуванням гілок.
Це означає, що якщо ви не скомпілюєте свою програму C ++, використовуючи правильні параметри для збірки RELEASE (а не збірки DEBUG), тоді ваша програма C ++ може працювати повільніше, ніж відповідна програма на базі C # або .NET. Вказуючи властивості проекту у вашому додатку C ++, переконайтеся, що ви ввімкнули "повну оптимізацію" та "віддайте перевагу швидкому коду". Якщо у вас 64-розрядна машина, ви ПОВИННІ вказати для генерації x64 як цільову платформу, інакше ваш код буде виконаний через підшар перетворення (WOW64), що істотно знизить продуктивність.
Після того, як ви виконаєте правильну оптимізацію в компіляторі, я отримую 0,72 секунди для програми C ++ та 1,16 секунди для програми C # (обидві у збірці випуску). Оскільки додаток C # є дуже простим і виділяє пам'ять, що використовується в циклі, у стеці, а не в купі, насправді він працює набагато краще, ніж реальний додаток, що бере участь у об'єктах, важких обчисленнях і з більшими наборами даних. Отже, наведені цифри - це оптимістичні цифри, упереджені до C # та .NET framework. Навіть маючи таке упередження, програма C ++ виконується трохи більше половини часу, ніж еквівалентна програма C #. Майте на увазі, що компілятор Microsoft C ++, який я використовував, не мав правильної оптимізації конвеєра та гіперпотоків (за допомогою WinDBG для перегляду інструкцій з монтажу).
Тепер, якщо ми використовуємо компілятор Intel (який, до речі, є галузевим секретом для створення високопродуктивних додатків на процесорах AMD / Intel), той самий код виконується за .54 секунди для виконуваного файлу C ++ проти .72 секунди за допомогою Microsoft Visual Studio 2010 Тож, врешті-решт, кінцеві результати становлять 0,5 секунди для С ++ та 1,16 секунди для С #. Отже, створення коду компілятором .NET JIT займає в 214% разів більше часу, ніж виконуваний файл C ++. Велику частину часу, проведеного за .54 секунди, отримували час від системи, а не в самому циклі!
У статистиці також бракує часу запуску та очищення, які не включені в терміни. Програми C # зазвичай витрачають на запуск та припинення набагато більше часу, ніж програми C ++. Причина цього складна і пов’язана з процедурами перевірки коду виконання .NET та підсистемою управління пам’яттю, яка виконує багато робіт на початку (а отже, і в кінці) програми з оптимізації розподілу пам’яті та сміття колектор.
Вимірюючи продуктивність C ++ та .NET IL, важливо поглянути на код збірки, щоб переконатися, що ВСІ розрахунки є. Я виявив, що без введення додаткового коду в C # більшість коду у прикладах вище фактично були видалені з двійкового файлу. Це було також у випадку з C ++, коли ви використовували більш агресивний оптимізатор, такий як той, що постачається з компілятором Intel C ++. Результати, які я надав вище, на 100% правильні та підтверджені на рівні складання.
Основна проблема багатьох форумів в Інтернеті полягає в тому, що багато новачків слухають маркетингову пропаганду Microsoft, не розуміючи технології, і роблять неправдиві твердження, що C # швидший за C ++. Твердження полягає в тому, що теоретично C # працює швидше, ніж C ++, оскільки компілятор JIT може оптимізувати код для процесора. Проблема цієї теорії полягає в тому, що в середовищі .NET існує багато сантехніки, яка сповільнює продуктивність; сантехніка, якої не існує в додатку C ++. Крім того, досвідчений розробник знатиме правильний компілятор, який використовуватиметься для даної платформи, і використовувати відповідні прапори під час компіляції програми. На платформах Linux або з відкритим кодом це не проблема, оскільки ви можете розповсюджувати своє джерело та створювати сценарії встановлення, які компілюють код, використовуючи відповідну оптимізацію. На вікнах або платформі із закритим кодом вам доведеться поширювати кілька виконуваних файлів, кожен із яких має певні оптимізації. Бінарні файли Windows, які будуть розгорнуті, базуються на центральному процесорі, виявленому програмою встановлення msi (за допомогою спеціальних дій).