为何Java Arrays.sort(int[])比C++ std::sort(vector<int>)快5倍?
Java与C++排序性能对比基准测试疑问
我正在开展Java与C排序性能对比基准测试,意外发现即使C以-O3编译Release版本,Java的Arrays.sort(int[])仍比C++的std::sort(std::vector<int>)快5倍以上。此外,在同一JVM进程、相同数据(仅将int替换为Integer)、相同规模下,Java Arrays.sort(int[])比Collections.sort(List)快30倍以上,体现了原生数组排序与基于对象的集合排序之间的巨大性能差距。
测试设置
- Java使用
Arrays.sort(int[])对新生成的int[]排序 - Java同时测试基于相同输入的
Collections.sort(List) - C++使用
mt19937生成输入,调用std::sort(std::vector<int>) - 所有测试重复执行至总测量时间超1秒
C++编译配置
set(CMAKE_CXX_STANDARD 20) target_compile_options(sort PRIVATE $<$<CONFIG:Release>:-O3>)
(CMake Release配置已默认启用-O3),GCC与Clang编译结果一致。
疑问
- 对C++
std::sort或Java排序的调用、时间测量方式是否存在问题? - Java的
Arrays.sort(int[])是否真的经过极致优化? - 为何Java原生数组排序比自身基于对象的
Collections.sort()快30倍?
补充说明
- 为聚焦Java与C++对比,注释了Java装箱Integer的耗时测试
- 测试重复至少4次,取最短耗时避免异常值干扰
- 插桩显示C++比较次数比Java多约28%,但无法完全解释性能差距
- 当前使用Java 24.0.1、GCC/Clang Release版本
500万数据典型结果
Java
size 5000000 nTrials=14 worst/best=1.293286 avg/best=1.072794 array sort time 70.512346 ms array sort time/size/log2(size) 0.633719 ns
C++(GCC)
size 5000000 nTrials = 4 worst/best = 1.02853 avg/best = 1.01016 vector sort time 393.92 ms vector sort time/size/log2(size) = 3.54029 ns cpp/java = 5.58654
内容的提问来源于stack exchange,提问作者Saku
相关产品推荐
相关产品推荐

