Java “For”循环,逐渐变慢

Java “For”循环,逐渐变慢,java,performance,for-loop,Java,Performance,For Loop,我编写了一个代码,显示循环的进度。部分代码: String instantBinary = ""; for (int i = 0; i < Text.length(); i++) { //Sometimes the text is too long if (Text.length() > 100) { if (Text.length() % (Text.length() / 100) == i % (T

我编写了一个代码,显示循环的进度。部分代码:

String instantBinary = "";
for (int i = 0; i < Text.length(); i++) {
    //Sometimes the text is too long                        

    if (Text.length() > 100) {
        if (Text.length() % (Text.length() / 100) == i % (Text.length() / 100)) {
            WTProgress = "Translate Progress.. %" + (i * 100 / Text.length());
            System.out.println(WTProgress); 
        }
    }

    switch("" + Text.charAt(i)) {
        case "1": 
            instantBinary += "0000000";
            break;
        case "2": 
            instantBinary += "0000001";
            break;
        case "3": 
            instantBinary += "0000010";
            break;
        case "4": 
            instantBinary += "0000011";
            break;
        case "5": 
            instantBinary += "0000100";
            break;
        case "6": 
            instantBinary += "0000101";
            break;
        case "7": 
            instantBinary += "0000110";
            break;
        case "8": 
            instantBinary += "0000111";
            break;
        case "9": 
            instantBinary += "0001000";
            break;
        default:
            System.out.println("Unknown character found \"" + Text.charAt(i) + "\""):
    }
事实上,翻译代码并没有那么短。有128个字符。但这不是问题所在。我最近试着翻译300页的文本。在5分钟内达到25%。但要达到100%需要3个小时。我如何解决这个问题


编辑:我解决了这个问题。问题的根源是每次我对一个字符串执行+=操作时,我实际上是在创建一个新的字符串实例,它们越来越长。正如您所说,我使用StringBuilder解决了这个问题。翻译代码的工作速度至少要快1000倍。感谢大家的帮助。

每次执行instantBinary+=00000000时,您都在创建一个新的字符串对象,并将大量数据从旧字符串复制到该对象中。这就是java的工作方式 您应该创建一个StringBuilder对象并使用myStringBuilder.append 00000000,最后使用myStringBuilder.toString获取字符串 更多信息

每次执行instantBinary+=00000000时,您都在创建一个新的字符串对象,并将大量数据从旧字符串复制到该对象中。这就是java的工作方式 您应该创建一个StringBuilder对象并使用myStringBuilder.append 00000000,最后使用myStringBuilder.toString获取字符串 更多信息

字符串instantBinary是一种不可变类型。每次对字符串执行+=操作时,实际上是在创建一个新的字符串实例,并且它们越来越长

请尝试为instantBinary使用StringBuffer或StringBuilder。

字符串instantBinary是不可变的类型。每次对字符串执行+=操作时,实际上是在创建一个新的字符串实例,并且它们越来越长


尝试将StringBuffer或StringBuilder用于instantBinary。

您正在内存中创建翻译。循环运行的时间越长,需要的内存就越多

使用-Xmx增加内存 使用StringBuilder。 使用全文所需的正确大小对其进行初始化。快速查看代码后,我发现它是原始文本大小的常量

StringBuilder instantBinary = new StringBuilder (text.length()*7);
打开字符,而不是字符串

switch(Text.charAt(i)){
    case '1': instantBinary.append("0000000"); break;
不要在记忆中这样做。读取一个文件,动态地将翻译写入输出文件


您正在内存中创建您的翻译。循环运行的时间越长,需要的内存就越多

使用-Xmx增加内存 使用StringBuilder。 使用全文所需的正确大小对其进行初始化。快速查看代码后,我发现它是原始文本大小的常量

StringBuilder instantBinary = new StringBuilder (text.length()*7);
打开字符,而不是字符串

switch(Text.charAt(i)){
    case '1': instantBinary.append("0000000"); break;
不要在记忆中这样做。读取一个文件,动态地将翻译写入输出文件


我不建议使用StringBuffer,因为在这种情况下不需要同步。StringBuilder就足够了。我不建议使用StringBuffer,因为在这种情况下不需要同步。一个StringBuilder就足够了。如果你想加快速度,那么是的……你可以像其他人建议的那样使用StringBuilder,但由于你想处理的数据量太大,你可能想通过使用ExecutorService来分担工作负载,并让多个线程处理业务。如果你想加快速度,那么是的……你可以使用StringBuilder正如其他人所建议的那样,但由于您要处理的数据量如此之大,您可能希望通过使用ExecutorService来分担工作负载,并让多个线程来处理业务。我要补充的是,如果输出是二进制的,最好使用ByteBuffer,如果需要一些特定的线程来写入,然后在ByteBuffer周围再做一个包装器方法来写,翻译代码的速度至少要快1000倍。谢谢你无数次。我想补充一点,如果输出是二进制的,最好使用ByteBuffer,如果需要一些特定的方法来写,那么只需要在ByteBuffer周围添加一个包装器方法来写。翻译代码的速度至少要快1000倍。万分感谢。。