0
hereまたはhereのような質問がいくつかあり、余分なスレッドがパフォーマンスを低下させる理由を尋ねます。私はそれらを得る。1つの余分なスレッドが大幅にパフォーマンスを向上させる
私は多少反対の質問があります.1つの余分なスレッドだけでは、どのようにしてパフォーマンスが向上するのでしょうか? 10または20?
コード例:スレッドのない
public class MainThreaded {
public static void main(String[]
String filePath = "my\\path\\";
String[] inFiles = {filePath+"file1.txt",filePath+"file2.txt"};
String[] outFiles = {filePath + "file1Out.txt", filePath + "file2Out.txt"};
long startTime = System.currentTimeMillis();
for (int i = 0; i < inFiles.length; i++) {
Adder adder = new Adder(inFiles[i], outFiles[i]);
// adder.doAdd();
Thread thread = new Thread(adder);
thread.start();
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("That took " + totalTime+ " milliseconds");
}
}
public class MainNoThread {
public static void main(String[] args) {
String filePath = "my\\path\\";
String[] inFiles = {filePath+"file1.txt",filePath+"file2.txt"};
String[] outFiles = {filePath + "file1Out.txt", filePath + "file2Out.txt"};
long startTime = System.currentTimeMillis();
for (int i = 0; i < inFiles.length; i++) {
Adder adder = new Adder(inFiles[i], outFiles[i]);
try {
adder.doAdd();
} catch (IOException e) {
e.printStackTrace();
}
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("That took " + totalTime+ " milliseconds");
}
}
public class Adder implements Runnable {
private String inFile, outFile;
public Adder(String inFile, String outFile){
this.inFile = inFile;
this.outFile = outFile;
}
public void doAdd() throws IOException{
int lines = 0;
try(BufferedReader reader = Files.newBufferedReader(Paths.get(inFile))){
while (reader.readLine() != null) {
lines++;
}
try(BufferedWriter writer = Files.newBufferedWriter(Paths.get(outFile))){
writer.write("Total: " + lines);
}
}
}
@Override
public void run() {
try {
doAdd();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 第一アプリは約かかります40ミリ秒
new Thread()
の1つだけを追加する第2のバージョンは2ミリ秒かかります。
私の質問:このような劇的な改善の背景は何ですか?
本当にスレッドが終了するのを待っていますか?コードを表示できますか? – Justas
ディスクキャッシュを考慮しましたか? – selbie
2番目のバージョンはどのように実装しましたか?両方のコードを見ることなく、何が起こるかを知ることは難しいです。おそらくあなたは最初にシングルスレッドを実行し、2番目のスレッドが実行されると、ファイルはすでにシステムのファイルシステムのキャッシュに入っていますか? – Axel