2013-05-15 6 views
-1

Я провел небольшие тесты на 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 будет на самом деле медленнее, считая ссылки указателей и выделяя память.

+0

Этот вопрос невозможно ответить. Это зависит от компилятора C++, версии JVM, тестовых программ, платформы, ... –

+0

Точка доступа (которая, как я полагаю, вы используете), является оптимизирующей средой выполнения. Распределение памяти по объектам происходит так быстро, что считается свободным. Тем не менее, я не видел ваш код на C++ или какую реализацию компилятора вы используете, поэтому я не могу прокомментировать, насколько это оптимально. –

+4

Вы не сравниваете яблоки с яблоками здесь. Для этой ситуации JVM использует предварительно выделенный пул памяти. C++ не имеет встроенных функций для такой конструкции и вместо этого запрашивает диспетчер памяти ОС для _every_ allocation. Нередко люди пишут систему, которая предоставляет то, что JVM делает здесь (распределитель пула памяти) на C++. Кроме того, это законный вопрос, и все downvotes - это BS. – David

ответ

10

Распределение множества мелких объектов в куче - это одна из ситуаций, когда время исполнения Java часто лучше оптимизировано из-за-коробки, чем C++ (в большинстве реализаций). Каждый раз, когда вы выделяете объект кучи в C++ с помощью new, реализация обычно выполняет системный вызов ОС (по крайней мере, на большинстве основных платформ, таких как Linux и Windows). В Java он обычно выделяется из пула памяти, предоставляемого JVM, который специально разработан и оптимизирован для выделения объектов Java в куче.

C++, скорее всего, будет быстрее в большинстве ситуаций, если вы используете специальный распределитель пула памяти. (Кроме того, C++ дает вам возможность выделять объекты в стеке, что, конечно, намного быстрее, чем любое из этого.)

В общем, C++ дает вам гораздо более мелкий контроль над тем, как ваша программа выделяет и управляет памятью. В то время как JVM ограничены фактической спецификацией языка Java, которая requires heap-allocated objects и сборкой мусора. Но если вы пишете приложение на C++, которое должно выделить много маленьких объектов в куче, возможно, вам захочется использовать распределитель пула памяти.