Языки не имеют скорости. Ни в спецификациях языка Java, ни в C ++ не указано, что «программы должны быть скомпилированы так, чтобы они были this эффективными».
Каждый язык определяет список того, что программа должна делать, или, по крайней мере, , кажется, делает , что в некоторых случаях ставит верхнюю границу того, насколько эффективна может быть программа, но часто - умна компилятор может игнорировать эти правила в отдельных программах, потому что все, что имеет значение, это то, что программа ведет себя , как если бы спецификация была соблюдена. Функции могут быть встроенными, данные кучи могут быть перемещены в стек и т. Д.
Производительность программы зависит от трех факторов: компилятора, базовой платформы / оборудования и самого программного кода.
Не "язык". Самый близкий к вам компилятор.
Есть веские причины, по которым один из языков может быть быстрее другого. C ++ дает меньше обещаний, которые потенциально могут замедлить выполнение программы, но Java поддерживает JIT, что означает, что он может потенциально использовать преимущества информации времени выполнения для оптимизации кода, что C ++ не может легко сделать ... И опять же, нигде в в спецификации сказано, что C ++ должен , а не быть jit'ом. Как я полагаю, есть и компиляторы Java, которые генерируют собственный код вместо байт-кода JVM.
Ваш вопрос имеет смысл, только если у вас есть конкретный компьютер, на котором вы работаете, конкретный компилятор для каждого языка и конкретная реализация вашей программы на каждом языке, в этом случае вы можете просто запустить оба посмотрим, что было самым быстрым .
Сборка мусора - еще один замечательный пример. Конечно, сборка мусора подразумевает некоторые накладные расходы, но она также допускает некоторые существенные сокращения. Выделение кучи смехотворно дешево в управляемых языках, таких как Java или .NET, , потому что управляется и собирает мусор. В C ++ это .... не определено, конечно, но на практике, как правило, очень медленно, потому что ОС приходится обходить кучу, чтобы найти свободный блок памяти в более или менее фрагментированном пространстве памяти. Какой самый быстрый? Зависит от ОС. Зависит от компилятора. Зависит от исходного кода.
Исходный код также имеет большое значение. Если вы возьмете программу Java и наивно перенесете ее на C ++, она будет работать как дерьмо. C ++ не очень хорошо справляется с виртуальными функциями, и, как правило, он предлагает превосходные альтернативы, которые вы можете использовать вместо этого. Выделение кучи может быть очень медленным в C ++, поэтому повторное выполнение Java-программы наивно будет крайне неэффективным. То же самое относится и к обратному пути. Многие идиомы C ++ были бы излишне медленными, если бы были перенесены непосредственно на Java. Так что, даже если вы остановились на одной платформе и одном компиляторе, как вы сравниваете производительность вашей программы? Чтобы даже передать его компилятору, вам нужно написать две его реализации, и тогда это уже не та же программа.
Однако, я думаю, будет справедливо сказать, что на большинстве современных аппаратных средств с современным Java-компилятором и современным C ++ -компилятором большинство программ могут быть реализованы, чтобы быть очень эффективными и, конечно, достаточно быстрыми. Но только если вы понимаете язык, с которым работаете, и играете по его правилам. Если вы попытаетесь написать код Java на C ++, то волшебным образом Java окажется гораздо более эффективным, и наоборот.
Полагаю, самый краткий ответ на ваш вопрос "Нет. Никто не может количественно оценить различия в производительности между C ++ и Java";)