与本机 .net 代码相比,Javonet 性能慢 10 倍?可能是由于对象数组?

Javonet performance 10x slower compared to native .net code? May be due to object array?

在另一个post中,我谈到了在javanet中需要支持原始数组。这是否可以解释为什么提取 ~2GB 的双精度数组比 .net 中的同类代码慢 10 倍左右?我附上了 JProfiler 的屏幕截图以防有帮助。 (另外,虽然没有显示,JProfiler 也显示了大约 1GB 的 Double 对象,我认为如果我们只有原语,它不应该存在;但是,这是缓慢的原因还是因为对 .net 的 ~40,000 次调用方法,以及与 Javonet 等之间的所有 "stuff" 最终需要几百毫秒左右?)

2018 年 5 月 3 日更新:

如果您阅读对第一个响应的评论,您最终会看到一个解决缓慢问题的构建 (hf16)。 Javonet 出现得相当快....我想这个版本最终会成为核心产品。

乔纳森,深入分析你的案例,你的表现问题的答案来自多种因素。让我一一解释:

  1. Boxing/Unboxing - 实际上这对您的结果有影响,如本帖中所回答 有测试版,其中包括强制 Javonet 的能力使用原始数组作为结果。所以这个问题很容易解决。
  2. 不必要的字符串传递 如此处所述 当前版本的 Javonet Java 开发人员仍然遇到一个问题,即使对于优化的后续方法调用方法名称已传递到 .NET 端并转换为 .NET 字符串。此外,对于每个结果,返回类型名称并将其转换为 Java 字符串。这已在 Javanet 中为 .NET 开发人员解决。我们在为 Java 开发人员将这些优化合并到 Javonet 中的临时构建中为您解决了这个问题。 (下面link)。
  3. 数据类型转换 分析您的结果,我们发现 "double" 处理中的一个问题可能会影响您的性能。这也包含在下面的临时构建 linked 中。
  4. 操作类型 对于 Javonet,成本最高的操作是值类型的即时转换。根据时间的不同,它要么超快(即布尔值)要么非常昂贵(即 UInt64)。所以你的情况很特殊,因为你很少进行跨界调用,但你做了很多值类型转换(2GB 的数组)。如果您比较多次调用(即 250k)生成素数以增加 "x" 参数的方法,您应该观察到完全不同的结果。 (如果你将它与通过网络服务调用相同的方法进行比较,我会快 1000 倍)
  5. 比较结果的方式 最后但非常重要的是,Javonet 性能会根据您执行的操作和比较结果的方式而有所不同。很明显,如果您调用一个纯粹在 .NET 中什么都不做的方法,它将被编译器优化并在几乎 "no time" 中执行。当您通过 Javonet 调用它时,将花费一些 "tiny" 时间(即 0.0000009 秒)将调用传递给 .NET。结果,当您将 "tiny" 除以 "no time" 时,就像将 10 除以 0,因此您可以假设它无限慢(这是否意味着 Javonet 很慢?- 不完全是)。但是,如果您调用一个方法来进行一些处理或从数据库等中检索数据。那么 Javonet 开销几乎不会被注意到

不稳定的测试版,修复了错误的字符串交换和双重数据类型转换: ...link 由于以下更新中包含较新的版本而被删除...

请仅将其用于测量目的。我们很高兴知道您的结果。很快这些更改将以稳定状态合并到正式版本中,我们会在之后通知您。

总结:您获得的性能结果有不同的原因。其中一些正在通过上述 beta 补丁解决,一些与您的测量方式和操作方式有关。 在许多情况下,Javonet 是 .NET 和 Java 之间最快的本机集成技术,这在我们许多客户的测试中得到认可并值得信赖在高频交易、实时数据处理、控制制造和医疗设备等解决方案中... 当然,仍然存在性能不同的情况和案例。遵循我们的原则之一 "be faster with each release",取得最高成果是我们的主要优先事项之一。如果需要,我们始终接受客户实施按需改进的性能挑战。我们确实接受你的,并将努力优化大型原始数组检索。

请测试上面的补丁,它应该有显着的改进,但仍然会受到环境原因点:4 和 5 的影响。

2018-04-30 更新:我们已经开始实施现代化的优化模块,以解决像您这样的场景,尽可能保持与本机几乎相同的最高性能。在下面的 link 下,您会发现在 "usePrimitiveArraysMode" 中工作的 alpha 版本适用于返回 "double[]" 且没有 ref/out 参数的非泛型方法。 IE。 double[] CreateArray() 或 double[] CreateArray(int size) 等...

http://download.javonet.com/1.5/javonet-1.5hf15-primitivearrays-opti-jtdn.jar