2008-09-15 9 views
5

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

+0

Прежде чем отвечать на этот вопрос, помните, что он спрашивает о нейронных сетях. Я думаю, что мы можем обойти всю дискуссию о родном коде и интерпретаторе, если мы по-прежнему будем подходить к этой теме. – 2008-09-15 16:53:09

+0

Удачи тратят 10 раз дольше, чтобы решить ту же проблему на C++. – 2009-07-19 05:08:16

ответ

10

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

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

Существует множество статей об этом. Если вы хотите получить подробную информацию, прочитайте Sun's excellent whitepaper. Для более неофициальной информации, try this one.

+0

C++ может делать то же самое с профилированными оптимизациями. – 2009-01-10 20:19:38

2

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

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

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

0

Это не строго о производительности C++ и Java, но тем не менее интересно в этом отношении: paper о производительности программ, запущенных в среде сбора мусора.

2

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

0

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

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

-1

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

0

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