You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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下的代码优化方案

针对代码中的性能瓶颈做以下调整:

  1. 替换Stream为手动数组解析:避免Stream在Java11中的额外开销,直接手动拆分字符串并转换为long数组。
  2. 复用常量字符串:提前定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:45:36