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




JIT Hotspot теперь может создавать код Быстрее, чем C++. Причина - эмпирическая оптимизация во время выполнения.
Например, он может видеть, что определенный цикл берет «ложную» ветвь в 99% случаев, и соответственно переупорядочивает инструкции машинного кода.
Об этом написано много статей. Если вам нужны все подробности, прочтите Превосходный технический документ Sun. Для получения дополнительной информации Попробуй это.
C++ может делать то же самое с оптимизацией по профилю.
Вот непредвзятый источник, показывающий, что Java на 19% медленнее, чем C / C++, в некоторых математических вычислениях с двойной точностью (отдаленно напоминающих нейронную сеть). Shotout.alioth.debian.org/u32q/…
Мне было бы интересно сравнить Hotspot JIT и C++, оптимизированный для оптимизации на основе профиля.
Проблема, которую я вижу с Hotspot JIT (и любым JIT-компилятором, оптимизированным для профиля выполнения), заключается в том, что необходимо сохранять статистику и изменять код. Хотя в отдельных случаях это приведет к более быстрому выполнению кода, я сомневаюсь, что оптимизированные для профиля JIT-компиляторы в большинстве случаев будут работать быстрее, чем хорошо оптимизированный код C или C++. (Конечно, я мог ошибаться.)
В любом случае, обычно вы будете во власти более крупного проекта, используя тот же язык, на котором он написан. Или вы будете во власти базы знаний ваших коллег. Или вы будете во власти целевой платформы (доступна ли JVM для целевой архитектуры?). В редких случаях, когда у вас есть полная свобода и вы знакомы с обоими языками, сравните их с инструментами, которые есть в вашем распоряжении. Это действительно единственный способ определить, что лучше.
Обратите внимание, что вы также можете выполнять оптимизацию Java-кода на основе профиля, поэтому, честно говоря, вам нужно выполнять профилированную оптимизацию для обоих или ни одного.
Да, конечно, но Hotsopt JIT ориентирован на профили (только во время выполнения). Все, что я говорил, это то, что Hotspot JIT действительно следует сравнивать с компиляцией C или C++, управляемой профилем (именно это вы и утверждаете в своем комментарии ко мне).
Речь идет не только о производительности C++ и Java, но тем не менее интересно в этом отношении: бумага о производительности программ, работающих в среде со сборкой мусора.
Единственно возможный ответ: сделайте прототип и измерьте сами. Если мой опыт представляет интерес, Java и C# всегда были намного медленнее, чем C++, в той работе, которую я выполнял - я думаю, в основном из-за большого потребления памяти. Конечно, можно прийти к совершенно другому выводу.
Если чрезмерная сборка мусора вызывает беспокойство, вы всегда можете повторно использовать неиспользуемые объекты с большим оттоком.
Создайте фабрику, которая хранит очередь SoftReferences для переработанных объектов, используя их перед созданием новых объектов. Затем в коде, который использует эти объекты, явным образом верните эти объекты на фабрику для повторного использования.
По большому счету, вы обсуждаете, может быть, разницу в производительности на 5%, когда вы получите увеличение на несколько порядков, перейдя на CUDA или выделенное оборудование.
Вероятно, C++, хотя я думаю, что вы вряд ли заметите разницу, кроме медленного времени запуска. Однако Java ускоряет разработку и упрощает обслуживание.
Прежде чем ответить на этот вопрос, помните, что он спрашивает о нейронных сетях. Я думаю, что мы можем обойти весь спор о нативном коде и интерпретаторе, если мы продолжим нашу тему.