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

Javonet性能比本机.net代码慢10倍?可能是由于对象数组?,javonet,Javonet,在另一篇文章中,我讨论了在javonet中支持原语数组的必要性。这能解释为什么提取价值约2GB的双数组要比.net中的类似代码慢10倍吗?我附上了一个JProfiler的截图,以防万一。(另外,尽管没有显示,JProfiler也显示了大约1GB的双对象,我认为如果我们只有原语,就不应该存在双对象;但是,这是速度慢的原因,还是因为对.net方法调用了约40000次,而Javone等中间的所有“东西”最终都需要几百毫秒左右的时间?) 2018年5月3日更新: 如果您阅读第一个响应的注释,您将最终看

在另一篇文章中,我讨论了在javonet中支持原语数组的必要性。这能解释为什么提取价值约2GB的双数组要比.net中的类似代码慢10倍吗?我附上了一个JProfiler的截图,以防万一。(另外,尽管没有显示,JProfiler也显示了大约1GB的双对象,我认为如果我们只有原语,就不应该存在双对象;但是,这是速度慢的原因,还是因为对.net方法调用了约40000次,而Javone等中间的所有“东西”最终都需要几百毫秒左右的时间?)

2018年5月3日更新:


如果您阅读第一个响应的注释,您将最终看到一个解决缓慢问题的构建(hf16)。Javonet看起来相当快……我想这个构建最终会成为核心产品。

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

  • 装箱/拆箱-事实上,这对您的结果产生了影响,正如本线程中所回答的,有一个beta版本,其中包括强制Javonet使用基本数组作为结果的能力。所以这个问题很容易解决
  • 传递了不必要的字符串如本文所述,Java开发人员的Javonet当前版本仍然存在一个问题,即即使对于优化的后续方法调用,方法名称也被传递到.NET端并转换为.NET字符串。此外,对于每个结果,返回类型名称并将其转换为Java字符串。这已经在Javonet中为.NET开发人员解决了。我们在临时构建中为您解决了这个问题,将这些优化合并到Java开发人员的Javonet中。(链接如下)
  • 数据类型转换通过分析您的结果,我们发现“双重”处理中存在一个可能影响您的性能的问题。下面链接的临时构建中也介绍了这一点
  • 操作类型对于Javonet,最昂贵的操作是即时转换值类型。根据时间的不同,它要么是超快的(即布尔值),要么是相当昂贵的(即UInt64)。因此,您的情况非常特殊,因为您很少进行跨边界调用,但需要进行大量的值类型转换(2GB的数组)。如果您比较多次调用(即250k)生成素数的方法以增加“x”参数,则应该观察到完全不同的结果。(如果您将其与通过web服务调用相同的方法进行比较,我将快1000倍)
  • 比较结果的方法最后但非常重要的一点是,Javonet的性能取决于您的操作和比较结果的方法。很明显,如果您调用一个纯在.NET中不做任何事情的方法,它将被编译器优化,并在几乎“不需要时间”的情况下执行。当您通过Javonet调用它时,将需要一些“微小”的时间(即0.0000009秒)才能将调用传递到.NET。结果是,当你用“微小”除以“没有时间”时,它就像是用10除以0,所以你可以假设它无限慢(这是否意味着Javonet是慢的?-不完全是)。但是,如果您调用一个方法来执行某些处理或从数据库中检索数据等那么Javone头顶将几乎无法识别
  • 不稳定的beta版,修复了错误的字符串交换和双数据类型转换: …由于以下更新中包含更新版本,链接已删除

    请仅用于测量目的。我们很高兴知道你的结果。很快,这些变更将在稳定状态下合并到正式构建中,我们将在之后通知您

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

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

    更新2018-04-30:我们已经开始实施现代化的优化模块,以解决像您这样的场景,保持尽可能高的性能,几乎与本机相同。在下面的链接下,您将看到alpha发行版,它在“usePrimitiveArraysMode”中工作,用于返回“double[]”而不带ref/out参数的非泛型方法。即双[]CreateArray()或双[]CreateArray(int size)等


    嗨,乔纳森,我看到你有897次调用sendCommandBinary,这意味着你调用.NET 897次而不是40k次。屏幕截图是否没有显示您的整个跑步过程,或者可能是由于意外,您错误地获取了大约40k的ms数?无论如何,我们已经回答了您的其他线程,因此请告诉我们使用原语是否可以改善您的结果。这将是可见的,尤其是如果您在一次调用中检索2Gb阵列。对于多个调用,在每个调用中不必要的转发方法名称方面还有改进的空间,正如我们在其他线程中提到的:我们将解决这个问题,并为您提供另一个构建,以便在此线程中进行测试