VLA 与 AOT 编译之间的性能差异?

Posted

技术标签:

【中文标题】VLA 与 AOT 编译之间的性能差异?【英文标题】:Performance differences between VALA vs AOT compilations? 【发布时间】:2012-02-11 02:43:08 【问题描述】:

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

背景(我知道的):

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

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

    是否可以使用 AOT 编译器生成 C/C++ 消耗性库? (我猜不会)。 生成的 AOT 二进制文件,是否还有桥接性能问题? (我猜是这样)。 在VALA 中调用C/C++ 库与从C 中调用它们的性能相同吗? (我猜是)。

有什么见解吗?

【问题讨论】:

这个问题似乎足够“有建设性”;或至少链接并关闭重复项。 对不起,我的英语可能不太好。我不确定为什么被投票关闭。感谢 pst 的支持。 【参考方案1】:

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

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

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

答案:否

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

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

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

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

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

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

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

3.在 VLA 中调用 C/C++ 库与从 C 中调用它们的性能相同吗?

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

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

答案:是的

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

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

【讨论】:

我认为一切都是正确的,除了 Vala 使用 gobject,而且众所周知 gobject 在构造实例和保持引用计数方面都很重。虽然我个人更喜欢引用计数的确定性,而不是跟踪垃圾收集器。

以上是关于VLA 与 AOT 编译之间的性能差异?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Intel 编译器的 Windows 和 Linux 之间的性能差异:查看程序集

32 位和 64 位进程之间的 memcpy 性能差异

C# 中的 ++i 和 i++ 之间是不是存在性能差异?

concat 与 || 之间是不是存在性能差异?在甲骨文中

双等号 (==) 和三等号 (===) 之间的 JavaScript 性能差异

双等号 (==) 和三等号 (===) 之间的 JavaScript 性能差异