Javonet性能比原生.net代码慢10倍?可能是由于对象数组?

时间:2018-04-27 19:20:16

标签: javonet

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

JProfiler hostspot view

更新5/3/2018:

如果您阅读第一个回复的评论,您最终会看到一个解决慢速问题的构建(hf16)。 Javonet看起来非常快......我想这个版本最终将成为核心产品。

1 个答案:

答案 0 :(得分:0)

Jonathan,深入分析您的案例,您的绩效问题的答案来自各种因素。让我逐一解释:

  1. 装箱/拆箱 - 确实这会对您的结果产生影响,正如此线程How to avoid autoboxing of primitives in arrays in javonet中所回答的那样,测试版本包括强制Javonet使用原始数组作为结果的能力。所以这个问题很容易解决。
  2. 不必要的字符串传递如此处所述Performance of Javonet当前版本的Javonet for Java开发人员仍然遇到一个问题,即使对于优化的后续方法调用,方法名称也传递给了.NET端并转换为.NET字符串。此外,对于每个结果,返回类型名称并将其转换为Java字符串。这已经在Javonet for .NET开发人员中得到了解决。我们在临时构建中为您解决了这个问题,将这些优化合并到Java开发人员的Javonet中。 (链接如下)。
  3. 数据类型转换分析您的搜索结果我们发现了" double"可能影响您的表现的处理。这也包含在下面链接的临时构建中。
  4. 操作类型对于Javonet来说,最昂贵的操作是值类型的即时转换。取决于时间,它是超高速(即布尔)或非常昂贵(即UInt64)。所以你的情况很特别,因为你做了很少的跨界调用,但是你做了很多值类型转换(2GB的数组)。如果你比较多次调用(即250k)方法产生素数以便增长" x"论点。 (如果将其与通过Web服务调用相同方法进行比较,我将快1000倍)
  5. 比较结果的方法最后但非常重要的是,Javonet的性能会根据您的操作以及比较结果的方式而有所不同。很明显,如果你调用一个纯粹在.NET中没有做任何事情的方法,它将被编译器优化并几乎在没有时间的情况下执行"。当你通过Javonet调用它时,它需要一些"微小的"将调用传递给.NET的时间(即0.0000009s)。结果当你划分"微小的" by"没时间"这就像把10除以0所以你可以假设它无限慢(这是否意味着Javonet很慢? - 不完全如此)。但是,如果你调用一个方法进行一些处理或从DB等中检索数据。那么Javonet开销几乎是不可用的
  6. 针对错误的字符串交换和双数据类型转换修复不稳定的beta版本 由于以下更新中包含的较新版本, ...链接已删除...

    请仅将其用于测量目的。我们很乐意知道您的结果。很快,这些变化将以稳定状态合并到官方版本,我们会在事后通知您。

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

    请测试上面的贴片应该会有明显的改善,但仍会受到环境原因的影响:4和5。

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

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