VALA和AOT编译之间的性能差异?

11

我一直在使用Java开发图像处理应用程序,但最近对VALA产生了兴趣。原因是我相信我可以提高应用程序的性能(我的主要关注点在与C/C++库的交互上,因为似乎在Java中使用C/C++桥接时会有性能损失,如示例所示)。

背景知识:

  • VALA会将代码转换成C代码,然后编译成本机机器代码。
  • AOT(Java/Mono C#)也可以生成本机机器代码(而不是使用虚拟机),但仍需要运行时依赖库。
  • 在某些情况下,使用虚拟机甚至可以比本机机器代码更快(因为可以通过JIT编译器进行优化)。
  • 可以使用VALA生成可消费的C/C++库。

有一些问题一直困扰着我,但我找不到答案:

  1. 是否可以使用AOT编译器生成可消费的C/C++库?(我猜不行)。
  2. 生成的AOT二进制文件是否仍然存在桥接性能问题?(我猜是的)。
  3. 从VALA调用C/C++库的性能是否与从C中调用它们的性能相同?(我猜是的)。

有什么见解吗?


这个问题似乎足够专注于“有建设性的”; 或者至少与重复的问题相关并已关闭。 - user166390
抱歉我的英语可能不是很好。我不确定为什么被投票关闭了。感谢pst的点赞。 - lepe
1个回答

6

1.使用AOT编译器可以生成可在C/C++中使用的消费库吗?

这似乎不可能,因为我们没有头文件,并且AOT编译器创建的不仅仅是一个C类,而只是机器代码。

(注:Java类可以{{link1:在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,您应该就可以了。

答案:是的

我仍然不知道为什么“某人”投票关闭了我的问题,甚至都没有留下评论。我认为这些问题/答案足够有建设性(如所评论的),并且对于那些新接触VALA或AOT编译器的人可能会有帮助。

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


1
我认为一切都是正确的,除了 Vala 使用 gobject,而 gobject 因构建实例和保持引用计数而闻名。尽管我个人更喜欢用引用计数来确定垃圾回收,而不是追踪垃圾回收机制。 - lethalman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接