c# - .NET 中的线程与进程

标签 c# multithreading

我有一个长时间运行的进程,它读取大文件并写入摘要文件。为了加快速度,我正在使用常规旧线程同时处理多个文件:

ThreadStart ts = new ThreadStart(Work);
Thread t = new Thread(ts);
t.Start();

我发现即使有单独的线程读取单独的文件并且它们之间没有锁定并且在 24 核机器上使用 4 个线程,我什至不能在 CPU 上达到 10% 或 10%磁盘输入/输出。如果我在我的应用程序中使用更多线程,它似乎运行得更慢。

我想我做错了什么,但奇怪的是,如果我第二次和第三次启动整个 exe,那么它处理文件的速度实际上是原来的两倍和三倍。我的问题是,为什么我不能在我的一个应用程序中获得 12 个线程来处理数据和对机器征税以及在我的应用程序的 3 个实例中获得 4 个线程?

我已经对应用程序进行了概要分析,最耗时和最常调用的函数都是字符串处理调用。

最佳答案

您的计算问题可能不是 CPU 限制,而是 I/O 限制。声明您的磁盘 I/O“仅占 10%”并没有帮助。我不确定这样的性能计数器是否存在。

使用更多线程时速度变慢的原因是因为这些线程都试图同时访问各自的文件,而磁盘子系统却很难容纳所有不同的线程。您会看到,即使使用 SSD 这样的现代技术,其寻道时间比传统硬盘驱动器小几个数量级,仍然会带来损失。

相反,您应该得出结论,您的问题受磁盘限制,单线程可能是解决问题的最快方法。

有人可能会争辩说,您可以使用异步技术来处理已读取的位,而在后台正在读入下一位,但我认为您会看到那里的性能改进非常小。

不久前我在一个小工具中遇到了类似的问题,我想计算我硬盘上所有文件的 MD5 签名,我发现 CPU 与存储系统相比太快了,我得到了类似的结果试图通过使用更多线程来获得更高的性能。

使用任务并行库并没有缓解这个问题。

关于c# - .NET 中的线程与进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597869/

相关文章:

c# - 在 C# 中获取 Windows Server 关闭原因

java - 安全随机 : thread safe without contention and still cryptographically secure?

iOS CloudKit 在 -fetchUserRecordIDWithCompletionHandler : 的完成 block 上崩溃

c# - 错误信息 "Compiler Error Message: CS1525: Invalid expression term ' }'"

java - 有这行代码和没有这行代码有什么区别? x = 5 之前的行;在 Starter() 方法中

linux - JVM控制系统线程

java - 如何让我的请求在后台运行,同时填充其他 EditText(线程)?

c# - 寻找一种创造性的设计模式

c# - 如何使用 Linq 表达式访问字典项

c# - SignalR - 在不同的 Redis 背板之间切换