Различия в производительности между компиляциями VALA и AOT? - PullRequest
10 голосов
/ 16 января 2012

Я занимаюсь разработкой приложения для обработки изображений на Java, но недавно меня заинтересовал VALA.Причина в том, что я считаю, что могу повысить производительность приложения (в основном меня беспокоит взаимосвязь с библиотеками C / C ++, так как <<a href="http://code.google.com/p/java-matrix-benchmark/"> Example > кажется, что при использовании мостов C / C ++ наблюдается снижение производительностив Java).

Справочная информация (что я знаю):

  • VALA преобразуется в код C, а затем компилируется в собственный машинный код.
  • AOT (Java/ Mono C #) также может создавать собственные машинные коды (вместо использования виртуальных машин, но все еще требует комплекта времени выполнения).
  • В некоторых случаях использование виртуальной машины может быть даже быстрее, чем собственный машинный код (поскольку его можно оптимизировать с помощью JIT-компилятора).
  • С помощью VALA можно создавать расходные библиотеки C / C ++..

Что-то происходит у меня в голове, и я не могу найти ответ:

  1. Можно ли создавать расходные библиотеки C / C ++ с использованием компилятора AOT?(Наверное, нет).
  2. Имеет ли созданный бинарный файл AOT проблему производительности моста?(Наверное, так и есть).
  3. Вызов библиотек C / C ++ в VALA имеет ту же производительность, что и вызов их из C?(Я думаю, это так).

Есть идеи?

1 Ответ

6 голосов
/ 17 января 2012

1.Можно ли создавать расходные библиотеки C / C ++ с использованием компилятора AOT?

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

(Примечание: классы Java можно вызывать внутри C / C ++ , но поскольку компиляторы AOT создают один двоичный файл, я уверен, что вы не сможете получить доступ к своим классам Java извне,файл).

Ответ: НЕТ

2.Имеет ли созданный двоичный файл AOT проблему производительности моста?

Во-первых, нам нужно знать: при вызове какого-либо класса C / C ++ из Java с использованием моста (например, JNI, javacpp и т.будет всегда приводить к потере производительности?

Согласно "W_" от ##java@irc.freenode.net:

это зависит от того, как вы его называете (например,если аргументы должны быть преобразованы и тому подобное).Простой вызов библиотечной функции без каких-либо аргументов или преобразования возвращаемого типа не должен занимать никакого другого времени, чем в любом приложении на Си.

Но поскольку я использую JavaCV в качестве моста для библиотеки OpenCV, он использует несколько типов объектов, которые, если вышеупомянутое верно, это должно влиять на производительность.

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

Ответ: ДА (но может быть немного быстрее)

3.Вызов библиотек C / C ++ в VALA имеет ту же производительность, что и вызов их из C?

Поскольку он конвертируется непосредственно в C, я не вижу причины, почему нет.Это было поддержано "nemequ" от #vala@irc.gimp.org:

в значительной степени, да.У vala есть привычка использовать временные переменные, но это именно то, что большинство компиляторов могут легко оптимизировать.если вы используете gcc, передайте -O2, и вы должны быть хорошими.

Ответ: ДА

Тем не менее я не знаю, почему "кто-то"проголосовал, чтобы закрыть мой вопрос, и он / она даже не удосужился прокомментировать об этом.Я думаю, что эти вопросы / ответы достаточно конструктивны (как прокомментировал pst ), и они могут быть полезны для других людей, плохо знакомых с компиляторами VALA или AOT.

Если мои выводы не верны, пожалуйста,поправь меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...