gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:26:35 29 4
gpt4 key购买 nike

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

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com