我很惊讶在Java源代码中看到System.arraycopy是一个本机方法.
当然原因是因为它更快.但是什么原生技巧是能够使用的代码使其更快?
为什么不循环遍历原始数组并将每个指针复制到新数组 - 当然这不是那么缓慢和麻烦?
在关于JVM基于char []实现字符串创建的方式的问题之后,我已经提到当char []被复制到新字符串的内部时不会发生迭代,因为最终会调用System.arraycopy,它使用诸如memcpy之类的函数在原生的,依赖于实现的级别(原始问题)复制所需的存储器.
我想亲自检查一下,所以我下载了Openjdk 7源代码并开始浏览它.我在OpenJDK C++源代码中找到了System.arraycopy的实现,在openjdx/hotspot/src/share/vm/oops/objArrayKlass.cpp:
if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
// elements are guaranteed to be subtypes, so no check necessary
bs->write_ref_array_pre(dst, length);
Copy::conjoint_oops_atomic(src, dst, length);
} else {
// slow case: need individual subtype checks
Run Code Online (Sandbox Code Playgroud)
如果元素不需要类型检查(例如原始数据类型数组的情况),则调用Copy :: conjoin_oops_atomic.
该Copy::conjoint_oops_atomic函数位于'copy.hpp'中:
// overloaded for UseCompressedOops
static void conjoint_oops_atomic(narrowOop* from, narrowOop* to, size_t count) {
assert(sizeof(narrowOop) == sizeof(jint), "this cast is wrong");
assert_params_ok(from, to, LogBytesPerInt);
pd_conjoint_jints_atomic((jint*)from, (jint*)to, count);
}
Run Code Online (Sandbox Code Playgroud)
现在我们依赖于平台,因为复制操作具有基于OS /体系结构的不同实现.我将以Windows为例.openjdk\hotspot\src\os_cpu\windows_x86\vm\copy_windows_x86.inline.hpp: …
String.toCharArray()java中的运行时间是多少?源代码是
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
Run Code Online (Sandbox Code Playgroud)
难道System.arrayCopy?有 O(n) 的运行时间吗?源代码并没有真正说明它是如何实现的。它是否遍历每个元素并复制它?谢谢。