相关疑难解决方法(0)

为什么System.arraycopy在Java中是原生的?

我很惊讶在Java源代码中看到System.arraycopy是一个本机方法.

当然原因是因为它更快.但是什么原生技巧是能够使用的代码使其更快?

为什么不循环遍历原始数组并将每个指针复制到新数组 - 当然这不是那么缓慢和麻烦?

java arrays native arraycopy

79
推荐指数
3
解决办法
2万
查看次数

OpenJDK实现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: …

c++ java openjdk jvm

9
推荐指数
1
解决办法
2447
查看次数

String.toCharArray() 的运行时间是多少?

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) 的运行时间吗?源代码并没有真正说明它是如何实现的。它是否遍历每个元素并复制它?谢谢。

java string runtime copy system

6
推荐指数
1
解决办法
2754
查看次数

标签 统计

java ×3

arraycopy ×1

arrays ×1

c++ ×1

copy ×1

jvm ×1

native ×1

openjdk ×1

runtime ×1

string ×1

system ×1