64 位 POSIX 系统。
POSIX 与分块数据复制相关的 CPU 特性无关
假设处理器缓存包含我的数组
在执行复制指令时会从主存跳闸中保存,但不影响大O符号的顺序。
寄存器的长度超过 64 位。
即使你的架构上支持 AVX512 支持 512 位宽 zmm 寄存器和 JDK 9+(AFAIK 运行时知道 AVX512 启动 JDK 9+),它也允许你复制 8 个打包的 64 位整数每个指令,但不影响复杂性的顺序。
因此,要复制 1024 个 64 位整数,您需要再次执行至少 128 个向量指令,从而产生 O(n) 复杂度,但常数较低。
HotSpot 实施说明:
arraycopy 实现的体系结构相关代码是在此处StubRoutines::initialize2 的 JVM 全局引导“阶段”上生成的。
特别是分块复制例程代码生成是在 HotSpot 代码的平台相关部分使用copy_bytes_forward 函数完成的(它是通过 HotSpot 自己的宏汇编器实现完成的)。
它的关键部分是 CPU 功能检查,例如
if (UseAVX > 2) {
__ evmovdqul(xmm0, Address(end_from, qword_count, Address::times_8, -56), Assembler::AVX_512bit);
__ evmovdqul(Address(end_to, qword_count, Address::times_8, -56), xmm0, Assembler::AVX_512bit);
} else if (UseAVX == 2) {
__ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
__ vmovdqu(xmm1, Address(end_from, qword_count, Address::times_8, -24));
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -24), xmm1);
} else {
//...
}
它根据可用的 CPU 功能生成代码。特征检测器是基于cpuid指令在依赖于架构的生成器generate_get_cpu_info中生成和调用的。