2011-10-25 110 views
1

我一直在试图弄清楚,如果一个io绑定应用程序中的多线程真的会提高性能或降低它。我读过的很多资料都是相互矛盾的。适用于io绑定应用程序的多线程:好还是坏

以此为例。

Why multithreading with io-bound is bad

接受的答案是,如果您的应用程序是IO的限制多线程会引起竞争和您的应用程序变慢。

在这个例子中,得票最高的答案表明它可以提高吞吐量。

Why multithreading with io-bound is good

我误解的东西吗?

在我的情况下,我需要从n个磁盘位置每秒读取n次。我发现很难决定是否应该使用线程。

例如,如果我有20个磁盘上的文件和20个独立的线程在等待和唤醒的状态下从磁盘读取,这是否会完全减慢我的系统? 如果一个pthread正在执行从磁盘读取的代码,那么所有其他19个线程在不同文件上做同样的事情会被阻塞吗?

+0

我们也在考虑Android上的多线程磁盘I/O方法。目前我们有超过20,000个文件,每个文件需要12ms的时间才能读取(这相当于4分钟 - 这很痛苦)。这个想法是产生N个线程并共享它们中的文件以尝试减少整体读取时间。你最终得出了什么明确的结论吗?我有兴趣听到任何你必须分享的东西。 P – protectedmember

回答

1

为什么你需要多线程呢?如果您使用单磁盘,多线程将在最佳情况下提供相同的性能,否则会稍慢一点。

+0

我现在开始认为我不需要它。我是一个没有经验的程序员,很努力地改进我的应用程序 – dubbeat

+0

想想如何减少存储在磁盘上的数据量,考虑二进制格式或一些快速压缩。 –

0

如果您的存储系统可以并行处理多个请求,那么其他线程将有助于处理IO界限的情况。在高端存储阵列上可能会出现这种情况,但在ipad等消费设备上不太可能出现这种情况。

1

在这个问题上:

Does it make sense to spawn more than one thread per processor?

那你打成“为什么用IO的限制是好的多线程”,最多的回答有16个upvotes,他指出:“如果你的软件,将频繁使用的磁盘或网络IO“。特别注意最后一部分,“网络IO”。这是你的第一个链接问题的一个独特因素,它只涉及线程和磁盘IO。

+0

磁盘io和网络io之间的区别是@ObscureRobot状态下的网络io可能能够“并行处理多个磁盘请求”? – dubbeat

+1

不只是这样。磁盘通常比网络快得多,因此可以一次提供多个网络链接。网络连接通常具有更高的延迟 - 与磁盘不同,在传输单个字节之前,可能需要几秒钟才能建立连接。由于某些线程可以传输数据,而其他线程正在等待DNS查找和4路/ 3路TCP握手完成,所以多线程可以缓解这种延迟。 –

相关问题