約 50,000 行でサイズが 1.1MiB の csv ファイルを読み込んでいます (さらに大きくなる可能性があります)。
Code1 では String を使用して csv を処理し、Code2 では StringBuilder を使用します (コードを実行するスレッドは 1 つだけなので、同時実行性の問題はありません)。
StringBuilder を使用すると、通常の String クラスを使用する場合よりもコードが読みにくくなります。
Code2 の StringBuilder を使用して、ヒープ スペースとメモリを少し節約するために時期尚早に最適化していませんか?
コード1
fr = new FileReader(file);
BufferedReader reader = new BufferedReader(fr);
String line = reader.readLine();
while ( line != null )
{
int separator = line.indexOf(',');
String symbol = line.substring(0, seperator);
int begin = separator;
separator = line.indexOf(',', begin+1);
String price = line.substring(begin+1, seperator);
// Publish this update
publisher.publishQuote(symbol, price);
// Read the next line of fake update data
line = reader.readLine();
}
コード 2
fr = new FileReader(file);
StringBuilder stringBuilder = new StringBuilder(reader.readLine());
while( stringBuilder.toString() != null ) {
int separator = stringBuilder.toString().indexOf(',');
String symbol = stringBuilder.toString().substring(0, separator);
int begin = separator;
separator = stringBuilder.toString().indexOf(',', begin+1);
String price = stringBuilder.toString().substring(begin+1, separator);
publisher.publishQuote(symbol, price);
stringBuilder.replace(0, stringBuilder.length(), reader.readLine());
}
編集
toString() 呼び出しを削除したため、生成される文字列オブジェクトが少なくなります。
コード3
while( stringBuilder.length() > 0 ) {
int separator = stringBuilder.indexOf(",");
String symbol = stringBuilder.substring(0, separator);
int begin = separator;
separator = stringBuilder.indexOf(",", begin+1);
String price = stringBuilder.substring(begin+1, separator);
publisher.publishQuote(symbol, price);
Thread.sleep(10);
stringBuilder.replace(0, stringBuilder.length(), reader.readLine());
}
また、元のコードはhttp://www.devx.com/Java/Article/35246/0/page/1からダウンロードします