【问题标题】:Speed in java why some codes run fasterjava中的速度为什么有些代码运行得更快
【发布时间】:2017-02-12 08:04:59
【问题描述】:

我正在尝试 UVa 问题编号10324 我编写了以下解决方案,这得到了接受,但给出了一个非常糟糕的 2.670 秒运行时间 我有以下两个代码 这是我的代码

    public static void main(String[] args) throws Exception{
        // write your code here
        StringBuilder op = new StringBuilder();
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader reader = new BufferedReader(isr);
            String input, tmp[];
            int n, l, u, j, i = 0;
            boolean dec;
            char thi;
            while ((input = reader.readLine()) != null) {
                op.append("Case " + (++i) + ":\n");
                n = Integer.parseInt(reader.readLine());
                while (n-- > 0) {
                    tmp = reader.readLine().split(" ");
                    l = Integer.parseInt(tmp[0]);
                    u = Integer.parseInt(tmp[1]);
                    if (l > u) {
                        l ^= u;
                        u ^= l;
                        l ^= u;
                    }
                    //System.out.println(l + "|" + u);
                    dec = true;
                    thi = input.charAt(l++);
                    for (; l <= u; l++) {
                        if (thi != input.charAt(l)||(thi != input.charAt(u--))) {
                            dec = false;
                            break;
                        }
                    }
                    op.append((dec ? "Yes\n" : "No\n"));
                }
            }
            System.out.print(op.toString());
            return;

    }
}

另一个代码是我从Mr Gorgon's Solution 中找到的 运行时间为 0.84 秒

public static void main(String[] args) throws Exception {
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    StringBuilder sb = new StringBuilder("");
    int testCase = 1;
    String line;
    while ((line = br.readLine()) != null) {
        sb.append("Case ").append(testCase).append(":\n");
        testCase++;
        int noOfCases = Integer.parseInt(br.readLine());
        for (int j = 0; j < noOfCases; j++) {
            String[] str = br.readLine().split(" ");
            int val1 = Integer.parseInt(str[0]);
            int val2 = Integer.parseInt(str[1]);
            if (val1 > val2) {
                val1 ^= val2;
                val2 ^= val1;
                val1 ^= val2;
            }
            boolean isValid = true;
            if (val1 != val2) {
                for (int i = val1; i < val2; i++) {
                    if (line.charAt(i) != line.charAt(i + 1)) {
                        isValid = false;
                        break;
                    }
                }
            }
            if (isValid)
                sb.append("Yes\n");
            else
                sb.append("No\n");
        }
    }
    System.out.print(sb);
}

我发现在所有任务基本相同的情况下,我很难理解为什么这段代码运行得这么快。而且我的代码比 Gorgons 代码的声明更少

【问题讨论】:

  • 声明实际上并没有真正增加太多的性能开销(而且我没有看到你真的有任何声明更少......)
  • 我用几个很长的字符串和很多较短的字符串创建了一些测试用例,并在本地运行了两个版本(windows 和 linux,jdk8),你的版本快了大约 2 倍。了解他们的(UVa)实际测试用例和他们使用的 java 运行时会很有趣。

标签: java performance optimization time


【解决方案1】:
  • op.append("Case " + (++i) + ":\n");

这否定了 StringBuilder 的好处

  • if (val1 != val2) { 在第二个版本中,循环的快捷方式

【讨论】:

  • 您的第二点无效。如果两个值相同,OP的循环条件也不会进入循环。
  • 不尝试使更改仍然保持相同的时间
【解决方案2】:

它是

input.charAt(l)!=input.charAt(l+1)

有助于加速程序的行我认为它与缓存有关

我研究并发现了一个叫做 JCS 的东西 这可能允许他们的 apache 服务器缓存内存数据并有助于更快地访问

【讨论】:

  • JCS 与此无关,但您是正确的,与您的版本相比,这一行使代码运行得更快
【解决方案3】:

您的解决方案中缺少以下代码。您正在盲目地循环,好像条件限制了循环。

if (val1 != val2) {
                                    }
            }

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 2020-05-14
    • 2012-06-29
    • 2019-01-31
    相关资源
    最近更新 更多