Производительность C++ / Java для нейронных сетей?

На днях я обсуждал нейронные сети (NN) с другом за обедом, и он утверждал, что производительность NN, написанного на Java, будет аналогична производительности, написанной на C++. Я знаю, что с техникой компиляции «точно в срок» Java может очень хорошо справиться, но почему-то я просто не куплюсь на это. Есть ли у кого-нибудь опыт, который пролил бы свет на эту проблему? Эта страница - это степень моего чтения по этому вопросу.

Прежде чем ответить на этот вопрос, помните, что он спрашивает о нейронных сетях. Я думаю, что мы можем обойти весь спор о нативном коде и интерпретаторе, если мы продолжим нашу тему.

Outlaw Programmer 15.09.2008 20:53

Удачи вам потратить в 10 раз больше времени на решение той же проблемы на C++.

mP. 19.07.2009 09:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
2 197
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

JIT Hotspot теперь может создавать код Быстрее, чем C++. Причина - эмпирическая оптимизация во время выполнения.

Например, он может видеть, что определенный цикл берет «ложную» ветвь в 99% случаев, и соответственно переупорядочивает инструкции машинного кода.

Об этом написано много статей. Если вам нужны все подробности, прочтите Превосходный технический документ Sun. Для получения дополнительной информации Попробуй это.

C++ может делать то же самое с оптимизацией по профилю.

Eric Meadows-Jönsson 10.01.2009 23:19

Вот непредвзятый источник, показывающий, что Java на 19% медленнее, чем C / C++, в некоторых математических вычислениях с двойной точностью (отдаленно напоминающих нейронную сеть). Shotout.alioth.debian.org/u32q/…

Andrew Bainbridge 21.09.2009 03:31

Мне было бы интересно сравнить Hotspot JIT и C++, оптимизированный для оптимизации на основе профиля.

Проблема, которую я вижу с Hotspot JIT (и любым JIT-компилятором, оптимизированным для профиля выполнения), заключается в том, что необходимо сохранять статистику и изменять код. Хотя в отдельных случаях это приведет к более быстрому выполнению кода, я сомневаюсь, что оптимизированные для профиля JIT-компиляторы в большинстве случаев будут работать быстрее, чем хорошо оптимизированный код C или C++. (Конечно, я мог ошибаться.)

В любом случае, обычно вы будете во власти более крупного проекта, используя тот же язык, на котором он написан. Или вы будете во власти базы знаний ваших коллег. Или вы будете во власти целевой платформы (доступна ли JVM для целевой архитектуры?). В редких случаях, когда у вас есть полная свобода и вы знакомы с обоими языками, сравните их с инструментами, которые есть в вашем распоряжении. Это действительно единственный способ определить, что лучше.

Обратите внимание, что вы также можете выполнять оптимизацию Java-кода на основе профиля, поэтому, честно говоря, вам нужно выполнять профилированную оптимизацию для обоих или ни одного.

Jason Cohen 15.09.2008 22:22

Да, конечно, но Hotsopt JIT ориентирован на профили (только во время выполнения). Все, что я говорил, это то, что Hotspot JIT действительно следует сравнивать с компиляцией C или C++, управляемой профилем (именно это вы и утверждаете в своем комментарии ко мне).

Kevin 16.09.2008 00:23

Речь идет не только о производительности C++ и Java, но тем не менее интересно в этом отношении: бумага о производительности программ, работающих в среде со сборкой мусора.

Единственно возможный ответ: сделайте прототип и измерьте сами. Если мой опыт представляет интерес, Java и C# всегда были намного медленнее, чем C++, в той работе, которую я выполнял - я думаю, в основном из-за большого потребления памяти. Конечно, можно прийти к совершенно другому выводу.

Если чрезмерная сборка мусора вызывает беспокойство, вы всегда можете повторно использовать неиспользуемые объекты с большим оттоком.

Создайте фабрику, которая хранит очередь SoftReferences для переработанных объектов, используя их перед созданием новых объектов. Затем в коде, который использует эти объекты, явным образом верните эти объекты на фабрику для повторного использования.

По большому счету, вы обсуждаете, может быть, разницу в производительности на 5%, когда вы получите увеличение на несколько порядков, перейдя на CUDA или выделенное оборудование.

Вероятно, C++, хотя я думаю, что вы вряд ли заметите разницу, кроме медленного времени запуска. Однако Java ускоряет разработку и упрощает обслуживание.

Другие вопросы по теме