【发布时间】:2018-12-22 10:40:30
【问题描述】:
我是多线程新手,今天我尝试在相同条件下运行一些多线程与单线程程序的性能测试。令我惊讶的是,我发现单线程选项的工作速度比多线程选项要快一些。那么可能是什么原因呢?
我编写了一个带有字符串连接类的简单程序,它将结果写入文件。我创建了 5 个包含 50000 个零的数组和 5 个输出文件,它们在 for 循环中传递给 Appender 类的构造函数。在多线程选项中,我调用 appender.run(),在单线程选项中,我注释掉所有与线程相关的行并改为调用 appender.appendString();
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws InterruptedException {
int[][] input = {new int[50000], new int[50000], new int[50000], new int[50000], new int[50000]};
File[] outputFiles = {new File("src\\text6.txt"), new File("src\\text7.txt"), new File("src\\text8.txt"),
new File("src\\text9.txt"), new File("src\\text10.txt")};
long startTime = System.currentTimeMillis();
Thread[] threads = new Thread[5];
for (int i = 0; i < 5; i++) {
Appender appender = new Appender(input[i], outputFiles[i]);
threads[i] = new Thread(appender);
threads[i].start();
appender.run();
}
for (Thread thread : threads) {
thread.join();
}
long stopTime = System.currentTimeMillis();
System.out.println(stopTime - startTime);
}
}
class Appender implements Runnable {
private String result;
private int[] input;
private File outputFile;
public Appender(int[] input, File outputFile) {
this.result = "";
this.input = input;
this.outputFile = outputFile;
}
public void appendString() {
for (int number : input) {
this.result += String.valueOf(number);
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(this.outputFile));) {
writer.write(this.result);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
appendString();
}
}
测量的执行时间(以毫秒为单位)适用于多线程大约 3600-3700 和单线程 2800-2900。与我的预期完全相反,因为所有线程都在不同的数组上工作并写入不同的文件。
【问题讨论】:
-
这将是 I/O 主导的,不是吗?对于旋转媒体,您可能会得到更差的结果(我假设您使用的是 SSD)。
-
你的系统有多少个内核?
-
这可能是您的代码示例中的拼写错误,或者是我对您评论的内容的误解而没有注释掉。但是在您调用“appender.run();”的“多线程”示例中,您应该只调用 Thread start(线程将为您调用 appender 上的 .run())。请参阅此处的其他答案以获取更多信息,但这可能有助于使您的示例更清晰
-
在我的机器上,单线程变体运行 6100 毫秒,多线程变体运行 5700 毫秒,因此顺序与您观察到的完全相反,而它们都是无论如何,运行速度比你的配置慢两倍。
-
“所有线程......写入不同的文件” - 但这些文件是否在不同的设备上,这是个问题。
标签: java multithreading performance