Але іноді, вже на тверезу голову, коли я думаю про подібному порівнянні, при всьому моєму бажанні зрозуміти, чому Java в принципі може бути не те що швидше, а хоча б не повільніше C ++, у мене не вистачає аргументів навіть для себе самого.
Для початку кілька "дано":
Покладемо, A - це лінійна швидкість виконання машинного коли. B - швидкість компіляції байт-коду JVM в машинний код. Тоді загальна швидкість виконання коду:
Очевидно, що B1 = 0. так як С ++ генерує машинний код безпосередньо і не вимагає додаткової роботи в процеси виконання. Але B2 стовідсотково НЕ нуль, так як яким би ефективним ні компілятор JIT, він ЗАВЖДИ вимагає якогось часу для компіляцію. Більш того, JIT НЕ компілює всі відразу, а "подкомпілірует" в міру проходження шляхів виконання. Виходить, завжди є ненульова ймовірність, що несподівано доведеться виконати код, що раніше не необхідний, і буде потрібно час на його компіляцію. Навіть якщо припустити, що компілятор JIT застосовує витончені способи передбачення шляхів виконання і робить все, щоб зменшити B2. але B2 за визначенням не 0. Якщо був би 0, то не було б JVM, а був би чистий машинний код.
Далі, розглянемо A1 і A2. Ці параметри визначають, наскільки ефективно компілятор створює код (або байт-код). На мою особисту, суб'єктивну і упередженого думку, у С ++ (не С) більше шансів на оптимізацію завдяки шаблонами (компілятор має повноцінну семантичну інформацію для проведення inline'а) і генерація машинного коду під конкретну платформу (компілятор точно знає, які машинні інструкції були б максимально ефективні в кожному випадку). На жаль, я не особливо сильний в generic'ах Java, і керуюся тільки чутками, що в Java вони "несправжні", додані набагато пізніше і поступаються шаблонами C ++. І так як компілятор зобов'язаний видати стандартний стерпний JVM-код, то немає можливості оптимізувати під конкретну платформу. Є надія, що це зробить JIT, але там вже не буде семантичної інформації для більш глибокої оптимізації. А ще JIT повинен бути швидкий, тобто буде компроміс між якістю оптимізації і швидкістю компіляції. В С ++ такої проблеми немає, так як компілювати можна як завгодно довго.
Отже, це мої доводи для мене самого, виміряні в віртуальних папуг. Не виходить у мене переконати самого себе, що Java може бути швидше або хоча б на рівні з С ++ по швидкості. Буду радий за допомогу в розумінні цього питання.
Ми зі Стасом проводили кілька нескладних порівнянь, в основному на реалізації QuickSort, і Java по лінійної швидкості коду програвала десь на 10%.
Зрозуміло, що 10% не завжди роблять погоду. Іноді важливіше розвинені інструменти інтроспекції, середовища розробки, контрольоване виконання, заміна коду нальоту і багато іншого, що дає платформа Java, і не дає "молотарка" C ++. Але навіщо говорити про швидкість то?