gpt4 book ai didi

C#:I/O 繁重的多线程性能不佳

转载 作者:行者123 更新时间:2023-11-30 18:48:22 25 4
gpt4 key购买 nike

我用 C# 编写了一个应用程序,可以同时将 jpg 从一组目录移动到另一组目录(每个固定子目录一个线程)。代码看起来像这样:

        string destination = "";
DirectoryInfo dir = new DirectoryInfo("");
DirectoryInfo subDirs = dir.GetDirectories();
foreach (DirectoryInfo d in subDirs)
{
FileInfo[] files = subDirs.GetFiles();
foreach (FileInfo f in files)
{
f.MoveTo(destination);
}
}

但是,该应用程序的性能非常糟糕 - 每秒出现大量页面错误。每个子目录中的文件数量可能会变得非常大,所以我认为上下文切换会带来很大的性能损失,因为它不能同时将所有不同的文件数组保存在 RAM 中,这样它就会进入磁盘几乎每一次。

我可以想到两种不同的解决方案。第一个是用 C 或 C++ 重写它,第二个是使用多进程而不是多线程。

编辑:文件根据时间戳命名,它们移动到的目录也基于该名称。所以它们被移动到的目录将对应于它被创建的时间;例如 3-27-2009/10。

我们正在为每个目录创建一个后台工作线程。

有什么建议吗?

最佳答案

经验法则,不要将具有串行依赖性的操作并行化。在这种情况下,您的硬盘驱动器是瓶颈,许多线程只会使性能变差。

如果您要使用线程,请尝试将数量限制为您拥有的可用资源数量、内核和硬盘数量,而不是您待处理的作业数量、要复制的目录数量。

关于C#:I/O 繁重的多线程性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/692857/

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