2017-01-27 22 views
1

ループの進行状況を示すコードを書きました。コードの一部:"For"ループ、徐々に減速する

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時間かかりました。この問題をどうやって解決するのですか?

EDIT:問題を解決しました。問題の原因は、文字列に対して+ =演算を実行するたびに、実際には新しい文字列インスタンスを作成するたびに発生し、長くなったり長くなったりします。あなたが言ったように、私はStringBuilderを使用して問題を解決しました。翻訳コードは少なくとも1000倍高速に動作します。助けてくれた皆様に感謝します。あなたはStringBuilderオブジェクトを作成する必要があります

+1

もしスピードを上げたいなら...他の人が示唆しているようにStringBuilderを使うことができますが、処理したいデータ量が非常に大きいので、ExecutorServiceを使ってワークロードを共有し、ケアビジネス。 – DevilsHnd

答えて

6

翻訳をメモリに作成しています。ループが長くなればなるほど、必要なメモリが増えます。 -Xmx

  • 使用のStringBuilderを使用して

    1. 増やしメモリ。
    2. は(コードで簡単に見、それが元のテキストサイズの一定の係数である私に語った。

      StringBuilder instantBinary = new StringBuilder (text.length()*7); 
      
    3. 文字ではなく、文字列

      上のスイッチフルテキストのために必要な正しいサイズでそれを初期化します
      switch(Text.charAt(i)){ 
          case '1': instantBinary.append("0000000"); break; 
      
    4. はメモリにそれをしないでください。その場で出力ファイルに翻訳を書き、一つのファイルから読み込む。

  • +0

    出力がバイナリの場合は、ByteBufferを使用する方が良いでしょう。また、必要に応じていくつか書き込んでください。ByteBufferの周りに1つの追加ラッパーメソッドを作成してそこに書き込んでください。 –

    +0

    翻訳コードは少なくとも1000倍高速です。何千もの時間をありがとう.. – Salihcan

    8

    あなたがinstantBinary+="00000000"を行うたびに、新しい文字列オブジェクトを再作成し、それにString古いからすべてのデータの巨大な量をコピーしている(これは、Javaが動作するだけの方法です)
    myStringBuilder.append ("00000000")を使用し、最終的にあなたの文字列を取得するには、myStringBuilder.toString()
    詳細情報here

    3

    String(instantBinary)を使用して不変タイプです。文字列に対して+=オペレーションを実行するたびに、実際には新しい文字列インスタンスが作成されており、長くなったり長くなったりしています。

    代わりにStringBufferまたはStringBuilderをinstantBinaryに使用してみてください。

    +1

    この場合、同期は必要ないため、StringBufferはお勧めしません。 StringBuilderで十分です。 –

    関連する問題