Java 11与Java 17性能差异排查及Java 11代码优化咨询
Codeforces 1807/G2 Java11超时、Java17通过的原因与优化方案
版本差异的核心原因
- Arrays.sort实现优化:Java17对基本类型数组的排序逻辑做了升级,在双轴快速排序的基础上优化了边界处理与数据交换策略,针对大规模数组的排序效率比Java11有明显提升。
- JIT编译能力升级:Java17的C2编译器在循环优化、自动向量化、逃逸分析等方面更成熟,
solve方法中的线性循环会被编译成更高效的机器码,减少运行时指令开销。 - Stream API性能提升:Java17优化了Stream的底层对象创建与中间操作逻辑,
Arrays.stream(...).mapToLong(...).toArray()这类操作的执行效率远高于Java11。
Java11下的代码优化方案
针对代码中的性能瓶颈做以下调整:
- 替换Stream为手动数组解析:避免Stream在Java11中的额外开销,直接手动拆分字符串并转换为long数组。
- 复用常量字符串:提前定义
YES/NO带换行的常量,减少StringBuilder拼接时的对象创建开销。
修改后的完整代码
import java.io.*; import java.util.*; public class Four { static PrintWriter pw = new PrintWriter(System.out); static final String YES = "YES\n"; static final String NO = "NO\n"; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); for (int i = 0; i < t; i++) { int size = Integer.parseInt(br.readLine()); String[] parts = br.readLine().split(" "); long[] end = new long[size]; for (int j = 0; j < size; j++) { end[j] = Long.parseLong(parts[j]); } Arrays.sort(end); sb.append(solve(end) ? YES : NO); } pw.println(sb); pw.close(); } public static boolean solve(long[] a) { if (a[0] != 1) return false; long sum = 1; for (int i = 1; i < a.length; i++) { if (a[i] > sum) return false; sum += a[i]; } return true; } }
内容的提问来源于stack exchange,提问作者hatsunemikufan
相关产品推荐
相关产品推荐

