Я провел небольшие тесты на Java и C++, создавая тонны очень маленьких объектов (без членов класса, ничего в конструкторах) и Java явно быстрее (я имею в виду, что C++ кажется очень медленным). Я уверен, что это связано с JVM, но каким образом?Почему распределение кучи C++ настолько медленное по сравнению с распределением кучи Java?
Edit:
Классы I были использованы, как это (как я уже говорил ни один из членов класса, ничего не сделано в конструкторах) в C++:
class foo{
public:
foo(){}
~foo(){}
}
И в Java:
public class Foo{
public Foo(){}
}
Небольшие тесты, которые я сделал, касались только выделения тонны объектов в петле (arround 1000000000 в строке). Я использовал GCC 4.7.2 и Java 1.7 через реализацию OpenJDK, как на одной машине с использованием Linux.
Бьюсь об заклад, что это действительно связано с распределением пула памяти, что указывает на то, что JVM владеет необработанной памятью.
Я все еще смущен, потому что думал, что JVM будет на самом деле медленнее, считая ссылки указателей и выделяя память.
Этот вопрос невозможно ответить. Это зависит от компилятора C++, версии JVM, тестовых программ, платформы, ... –
Точка доступа (которая, как я полагаю, вы используете), является оптимизирующей средой выполнения. Распределение памяти по объектам происходит так быстро, что считается свободным. Тем не менее, я не видел ваш код на C++ или какую реализацию компилятора вы используете, поэтому я не могу прокомментировать, насколько это оптимально. –
Вы не сравниваете яблоки с яблоками здесь. Для этой ситуации JVM использует предварительно выделенный пул памяти. C++ не имеет встроенных функций для такой конструкции и вместо этого запрашивает диспетчер памяти ОС для _every_ allocation. Нередко люди пишут систему, которая предоставляет то, что JVM делает здесь (распределитель пула памяти) на C++. Кроме того, это законный вопрос, и все downvotes - это BS. – David