繁体   English   中英

“ For”循环,逐渐变慢

[英]“For” Loop, gradually slowing down

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

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%。 但是花了3个小时才达到100%。 我该如何解决这个问题?

编辑:我解决了问题。 问题的根源是,每当我对字符串执行+ =操作时,我实际上都会创建一个新的字符串实例,并且它们变得越来越长。 如您所说,我使用StringBuilder解决了该问题。 翻译代码的运行速度至少要快1000倍。 感谢所有提供帮助的人。

每次您执行instantBinary+="00000000" ,您都在重新创建一个新的字符串对象,并将来自旧String所有大量数据复制到其中(这就是Java的工作方式)
您应该创建一个StringBuilder对象并使用myStringBuilder.append ( "00000000" ) ,最后使用myStringBuilder.toString ()来获取您的字符串
更多信息在这里

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

  1. 使用-Xmx增加内存
  2. 使用StringBuilder。
  3. 使用全文所需的正确大小对其进行初始化(快速查看代码会发现它是原始文本大小的常数。

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

     switch(Text.charAt(i)){ case '1': instantBinary.append("0000000"); break; 
  5. 不要在内存中这样做。 从一个文件读取,然后立即将翻译内容写入输出文件。

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

请尝试使用StringBufferStringBuilder代替InstantBinary。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM