“代码大小”对 Java 性能的巨大影响,为什么?

问题描述

我试图处理一些近似模拟确定性有限状态自动机的文本文件。这很有效,但性能绝对糟糕。

我开始调查并发现“代码大小”对性能一个奇怪且非常大的影响。我创建了一个虚拟程序来说明效果。以下在我的电脑上速度可以接受(~0.250 秒):

package com.foo.bar;

import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;

public class DummyFileProcessor {

    public static void main(String[] args) throws IOException {
        // `args[0]` is the path to the "citylots.json" file from here:
        // https://github.com/zemirco/sf-city-lots-json (181 MB).
        
        final long startTime = System.currentTimeMillis();
        
        final short statealwaysZero = 0; // always 0 in this demo
        
        try (Reader reader = Files.newBufferedReader(Paths.get(args[0]))) {
            final char[] chunk = new char[4096];
            
            for (int chunkLength = reader.read(chunk); chunkLength != -1; chunkLength = reader.read(chunk)) {
                for (int i = 0; i < chunkLength; ++i) {
                    final short triggerAlwaysZero = 0; // always 0 in this demo
                    
                    switch (statealwaysZero) {
                    case 0: {
                        switch (triggerAlwaysZero) {
                        case 0: { break; }
                        case 1: { break; }
                        case 2: { break; }
                        case 3: { break; }
                        case 4: { break; }
                        case 5: { break; }
                        case 6: { break; }
                        case 7: { break; }
                        case 8: { break; }
                        case 9: { break; }
                        case 10: { break; }
                        case 11: { break; }
                        case 12: { break; }
                        case 13: { break; }
                        case 14: { break; }
                        case 15: { break; }
                        case 16: { break; }
                        case 17: { break; }
                        case 18: { break; }
                        case 19: { break; }
                        case 20: { break; }
                        case 21: { break; }
                        case 22: { break; }
                        case 23: { break; }
                        case 24: { break; }
                        case 25: { break; }
                        case 26: { break; }
                        case 27: { break; }
                        case 28: { break; }
                        case 29: { break; }
                        }
                        break;
                    }
                    case 1: { break; }
                    case 2: { break; }
                    case 3: { break; }
                    case 4: { break; }
                    case 5: { break; }
                    case 6: { break; }
                    case 7: { break; }
                    case 8: { break; }
                    case 9: { break; }
                    case 10: { break; }
                    case 11: { break; }
                    case 12: { break; }
                    case 13: { break; }
                    case 14: { break; }
                    case 15: { break; }
                    case 16: { break; }
                    case 17: { break; }
                    case 18: { break; }
                    case 19: { break; }
                    case 20: { break; }
                    case 21: { break; }
                    case 22: { break; }
                    case 23: { break; }
                    case 24: { break; }
                    case 25: { break; }
                    case 26: { break; }
                    case 27: { break; }
                    case 28: { break; }
                    case 29: { break; }
                    case 30: { break; }
                    case 31: { break; }
                    case 32: { break; }
                    case 33: { break; }
                    case 34: { break; }
                    case 35: { break; }
                    case 36: { break; }
                    case 37: { break; }
                    case 38: { break; }
                    case 39: { break; }
                    }
                }
            }
        }
        
        final long endTime = System.currentTimeMillis();
        System.out.println("done after " + (((double) (endTime - startTime)) / 1000) + "s");
    }
}

现在我只是将 switch (triggerAlwaysZero) { ... } 部分复制到 1 的其他案例 (2,switch (statealwaysZero),...) 中(这些案例从未被选中)。这会使代码变大,但仅对 033 的情况进行处理时不会产生太大影响。但是,当我将此 switch (triggerAlwaysZero) { ... } 部分也粘贴到案例 34 时,处理时间突然从大约 0.250 秒跳到大约 3.7 秒

有人知道这里发生了什么吗?

$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1,mixed mode)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...