Подтвердить что ты не робот

Различия в производительности между сборками VALA и AOT?

Я разрабатываю приложение для обработки изображений на Java, но я недавно интересовался VALA. Причина в том, что я считаю, что могу увеличить производительность приложения (моя проблема связана главным образом с взаимосвязью с библиотеками C/С++, поскольку, кажется, < Пример > , что есть наказание за исполнение при использовании мостов C/С++ в Java).

Фон (что я знаю):

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

Есть что-то, что происходит вокруг моей головы, и я не могу найти ответ:

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

Любое понимание?

4b9b3361

Ответ 1

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

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

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

Ответ: NO

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

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

В соответствии с "W_" из ##[email protected]:

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

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

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

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

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

Когда он преобразуется непосредственно в C, я не вижу причины, почему нет. Это было поддержано "nemequ" из #[email protected]:

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

Ответ: YES

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

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