11

我一直在用 Java 开发一个图像处理应用程序,但我最近对 ​​VLA 很感兴趣。原因是因为我相信我可以提高应用程序的性能(我关心的主要是与 C/C++ 库的互连,因为在 Java 中使用 C/C++桥接器时似乎有性能惩罚)。

背景(据我所知):

  • VLA 翻译成 C 代码,然后编译成本地机器代码。
  • AOT (Java/Mono C#) 也可以生成本机机器代码(而不是使用 VM,但仍需要运行时捆绑包)。
  • 在某些情况下,使用 VM 甚至可以比本地机器代码更快(因为它可以通过 JIT 编译器进行优化)。
  • 可使用 VLA 生成可消费的 C/C++ 库。

有一些事情在我的脑海中萦绕,我找不到答案:

  1. 可以使用 AOT 编译器生成 C/C++ 消耗性库吗?(我猜不是)。
  2. 生成的 AOT 二进制文件,是否还有桥接性能问题?(我想确实如此)。
  3. 在 VLA 中调用 C/C++ 库与从 C 中调用它们的性能相同吗?(我想是的)。

有什么见解吗?

4

1 回答 1

6

1. 可以使用 AOT 编译器生成 C/C++ 消耗性库吗?

这不应该是不可能的,因为我们没有头文件,而且严格来说它不是 AOT 编译器正在创建的 C 类,而只是机器代码。

(旁注:Java 类可以在 C/C++ 内部调用,但由于 AOT 编译器生成单个二进制文件,我确信您无法从该文件外部访问您的 Java 类)。

答案:没有

2. 生成的 AOT 二进制文件,是否还有桥接性能问题?

首先,我们需要知道:如果使用桥接器(如 JNI、javacpp 等)从 Java 调用任何 C/C++ 类都会导致性能损失?

根据##java@irc.freenode.net 的“W_”:

这取决于您如何调用它(例如,是否必须转换参数等)。只需调用没有任何参数或返回类型转换的库函数,所花费的时间与在任何 C 应用程序中所花费的时间应该没有什么不同。

但是由于我使用 JavaCV 作为 OpenCV 库的桥梁,它使用了几种类型的对象,如果上述情况属实,它应该会影响性能。

因此,AOT 编译可能会稍微加快执行速度,但仍然必须通过桥接并进行类型转换,这可能是合乎逻辑的。

答案:是(但可能会稍微快一点)

3. 在VALA中调用C/C++库和从C中调用的性能一样吗?

因为它直接转换为 C,所以我看不出有什么不这样做的原因。这得到了来自#vala@irc.gimp.org 的“nemequ”的支持:

差不多,是的。vala 有使用临时变量的习惯,但这正是大多数编译器可以轻松优化掉的那种东西。如果您使用的是 gcc,请通过 -O2,您应该会很好。

答案:是的

我仍然不知道为什么“某人”投票结束我的问题,而他/她甚至懒得对此发表评论。我认为这些问题/答案足够有建设性(正如pst评论的那样),它们可能对其他不熟悉 VLA 或 AOT 编译器的人有所帮助。

如果我的结论不正确,请纠正我。

于 2012-01-17T03:02:57.800 回答