Тому що між оптимізацією продуктивності та повністю відключенням безпеки є величезна різниця
За рахунок зменшення кількості GC їх основи стають більш чуйними і можуть працювати (імовірно) швидше. Тепер оптимізація збору сміття не означає, що вони ніколи не роблять сміття. Це просто означає, що вони роблять це рідше, і коли вони це роблять, це працює дуже швидко. До таких видів оптимізації належать:
- Зведення до мінімуму кількості об’єктів, які переміщуються до простору, що вижив (тобто, який пережив хоча б одне сміття) за допомогою невеликих предметів, що викидаються. Об'єкти, які перемістилися до простору, що вижили, важче збирати, а збирання сміття тут колись передбачає заморожування всього СВМ.
- Не виділяйте занадто багато об’єктів для початку. Це може призвести до пожежі, якщо ви не будете обережні, оскільки об'єкти молодого покоління дуже дешево виділяти та збирати.
- Переконайтесь, що новий об’єкт вказує на старий (а не навпаки), щоб молодий об’єкт було легко зібрати, оскільки немає посилання на них, що призведе до їх збереження
Коли ви налаштовуєте продуктивність, зазвичай ви налаштовуєте якусь дуже специфічну "гарячу точку", ігноруючи код, який працює не часто. Якщо ви робите це на Java, ви можете дозволити сміттєзбірнику ще піклуватися про цей темний куточок (оскільки це не призведе до великої різниці), при цьому дуже ретельно оптимізуючи область, яка працює в тісному циклі. Таким чином, ви можете вибрати, де ви оптимізуєте, а де - ні, і таким чином можете зосередити зусилля там, де це важливо.
Тепер, якщо вимкнути повністю сміття, вибирати не можете. Ви повинні вручну утилізувати кожен предмет будь-коли. Цей метод викликають не більше одного разу на день? На Java це можна дозволити, оскільки його вплив на продуктивність незначний (можливо, нормально, щоб кожен місяць відбувався повний GC). У C ++ ви все ще просочуєтеся ресурсом, тому вам потрібно подбати навіть про цей незрозумілий метод. Отже, ви повинні заплатити ціну за управління ресурсами в кожній, окремій частині вашої програми, тоді як на Java ви можете зосередитись.
Але стає гірше.
Що робити, якщо у вас помилка, скажімо, у темному кутку вашої заявки, до якого можна отримати доступ лише у понеділок у повний місяць? Java мають високу гарантію безпеки. "Невизначеної поведінки" майже немає. Якщо ви використовуєте щось неправильно, викидається виняток, ваша програма зупиняється, і не виникає пошкодження даних. Тож ви майже впевнені, що нічого поганого не може трапитися, не помітивши.
Але в чомусь на зразок D у вас може бути поганий доступ до вказівника або переповнення буфера, і ви можете пошкодити пам’ять, але програма не знатиме (ви вимкнули безпеку, пам’ятаєте?) І буде продовжувати працювати з її неправильним Дані, зробіть якісь неприємні речі і зіпсуйте ваші дані, і ви цього не знаєте, і як більше корупції трапляється, ваші дані стають все більш неправильними, а потім раптом вони ламаються, і це було в критичному для життя додатку, і деякі помилки сталися в обчисленні ракети, і тому він не працює, а ракети вибухають, а хто - то вмирає, і ваша компанія знаходиться в першій сторінці кожної газети і ваша точка бос його палець до вам сказати «Ви перебуваєте інженер, який запропонував нам використовувати D для оптимізації продуктивності, чому ж ви не думали про безпеку?». І це ваша вина. Ви вбили тих людей , з дурною спробою виконання.
Гаразд, добре, більшість часу це набагато менш драматично, ніж це. Але навіть критично важливий бізнес-додаток або просто програма GPS або, скажімо, урядовий веб-сайт охорони здоров’я може призвести до досить негативних наслідків, якщо у вас є помилки. Застосування мови, яка або перешкоджає їм повністю, або невдачі, коли вони трапляються, зазвичай є дуже хорошою ідеєю.
Існує вартість вимкнення запобіжного обладнання. Їхати рідним не завжди має сенс. Іноді набагато простіше і безпечніше просто оптимізувати трохи безпечну мову, щоб перейти на мову, куди ви можете стріляти в ногу великого часу. Коректність та безпека у багатьох випадках козирять кілька наносекунд, які ви б зняли, усунувши GC повністю. Disruptor може бути використаний в тих ситуаціях, так що я думаю , що LMAX-біржа зробила правильний виклик.
А як щодо D зокрема? У вас є GC, якщо ви хочете для темних кутів, а підмножина SafeD (про яку я не знав до редагування) видаляє невизначене поведінку (якщо ви пам’ятаєте, що ним користуєтесь!).
Ну і в цьому випадку це просте питання зрілості. Екосистема Java повна добре написаних інструментів та зрілих бібліотек (краще для розвитку). Набагато більше розробників знають Java, ніж D (краще для обслуговування). Пошук нових і не настільки популярних мов для чогось такого критичного, як фінансовий додаток, не був би гарною ідеєю. З менш відомою мовою, якщо у вас є проблеми, мало хто може допомогти вам, а в бібліотеках, які ви знайдете, як правило, більше помилок, оскільки вони потрапили до меншої кількості людей.
Тож мій останній пункт все-таки дотримується: якщо ви хочете уникнути проблем зі страшними наслідками, дотримуйтесь безпечного вибору. На даний момент життя D його замовник - маленькі стартапи, готові ризикувати. Якщо проблема може коштувати мільйони, вам краще залишитися далі в кривій дзвони інновацій .