首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java的System.arraycopy()对于小数组是有效的吗?

Java的System.arraycopy()对于小数组是有效的吗?
EN

Stack Overflow用户
提问于 2011-12-16 05:33:21
回答 5查看 17K关注 0票数 56

Java的System.arraycopy()对于小数组是有效的吗,或者它是一个本机方法的事实使得它的效率可能比简单的循环和函数调用低得多?

本机方法是否会因为跨越某种类型的Java系统桥而产生额外的性能开销?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-16 05:46:16

稍微扩展一下Sid所写的内容,很可能System.arraycopy只是一个JIT固有的;这意味着当代码调用System.arraycopy时,它很可能会调用一个特定于JIT的实现(一旦JIT将System.arraycopy标记为“热”),该实现不会通过JNI接口执行,因此它不会引起本机方法的正常开销。

通常,执行本机方法确实会有一些开销(通过JNI接口,在执行本机方法时,一些内部JVM操作也不会发生)。但这并不是因为一个方法被标记为“本地”,您实际上是在使用JNI来执行它。JIT可以做一些疯狂的事情。

最简单的检查方法是,正如已经建议的那样,编写一个小的基准测试,注意Java微基准测试的一般注意事项(首先预热代码,避免没有副作用的代码,因为JIT只是将其优化为无操作,等等)。

票数 28
EN

Stack Overflow用户

发布于 2011-12-16 11:48:19

这是一个合理的担忧。例如,在java.nio.DirectByteBuffer.put(byte[])中,作者尽量避免对少量元素进行JNI复制

代码语言:javascript
复制
// These numbers represent the point at which we have empirically
// determined that the average cost of a JNI call exceeds the expense
// of an element by element copy.  These numbers may change over time.
static final int JNI_COPY_TO_ARRAY_THRESHOLD   = 6;
static final int JNI_COPY_FROM_ARRAY_THRESHOLD = 6;

对于System.arraycopy(),我们可以检查它是如何使用它的。例如,在ArrayList中,总是使用System.arraycopy(),而不是“一个元素一个元素地复制”,不管长度如何(即使它是0)。由于ArrayList对性能非常敏感,因此我们可以得出System.arraycopy()是最有效的数组复制方式,而不管长度如何。

票数 19
EN

Stack Overflow用户

发布于 2013-07-11 13:25:34

System.arraycopy使用memmove操作来移动单词,并在幕后使用汇编来移动C中的其他基本类型。因此,它会尽其最大努力,尽可能高效地移动。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8526907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档