【问题标题】:How to avoid autoboxing of primitives in arrays in javonetjava - 如何避免在javonet中对数组中的基元进行自动装箱
【发布时间】:2018-04-24 13:30:57
【问题描述】:

根据https://www.javonet.com/java-devs/guides/working-with-net-arrays-and-collections-from-java-with-javonet/ 中的示例,如果Java 调用的dll 返回一个int 数组,Javonet 将只显示一个Integer 类数组(而不是原语)。由于在我的情况下数组很大(大约 2GB 的数组),Javonet 有什么办法不自动装箱,而是返回一个基元数组?

【问题讨论】:

  • 仅供参考:我问是因为数组中有 2GB 的原语,我假设装箱然后自动装箱会显着损害性能(基于我过去的自动装箱经验)
  • Jonathan 实际上当前用于 Int32 数组的 Javonet 将默认返回装箱的 Integer 数组。但是,我们确实同意您的建议,即应该可以得到纯 int[]。我们的开发团队正在为此努力,我希望我们能够为此发布一些热修复(可能需要大约 1-3 天)。
  • 那太好了!这可能很明显,但在我们的例子中,它是我们提取的一个双精度数组和一个浮点数组(所有基元)。 (我之前提到整数只是为了使其与 Javonet 示例保持一致,但我认为应该(理想情况下)支持所有原语。)
  • 另外,我很清楚,Javonet 是否会在内部将 Float 转换为浮动(我可以自己做),或者它是否足够聪明地意识到如果 .net 正在使用一个数组原语,它可以返回相同的原语数组(它甚至是相同的内存空间,以便我们避免不必要的复制中的 CPU 和内存周期吗?)
  • 我们从 .NET 端接收原始格式的值,因此我们将仅从原始 Java 原始类型创建,而不是将装箱的类型转换为未装箱的类型。

标签: javonet


【解决方案1】:

我们已经实现了允许您选择 Javonet 是否应该返回装箱或未装箱数组的机制。它可以用于您的应用程序的整个范围,也可以为特定操作临时设置,但是请记住,它的 beta 版本和该选项会影响所有线程,因此如果有选择地使用,应谨慎使用。

请使用此版本: http://download.javonet.com/1.5/javonet-1.5hf15-primitivearrays-opti-jtdn.jar

随时激活原始数组模式调用:

Javonet.setUsePrimitiveArrays(true);

此模式影响所有原始类型:int、long、short、byte、float、double、boolean、char... 要取消此模式,只需设置“false”即可。

一旦确认它可以提高您的性能,我们会将其包含在最终构建中并分别更新此答案。

【讨论】:

  • 这个构建工作并且至少将时间减少了一半。 (与其他一些与 Javonet 无关的技巧,我的时间又减少了 5 倍......)。我仍在测试内存消耗是否也减少了,但至少初步结果是肯定的。
  • 我们今天已将此链接从 hf11 更新到 hf15,请告诉我您使用的是哪个版本?是hf15吗?请在此处查看stackoverflow.com/questions/50069008/… hf15 应该极大地提高返回 double[] 并接受无参数或非 ref/out 参数的方法的性能。期待你的结果。未来几天将支持更多方法和原语。
  • 是的,我们使用了 hf15(有效)。我们还使用了 hf12(它引发了运行时错误,但我看到你删除了那个链接(这很好))
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2011-01-19
相关资源
最近更新 更多