作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 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/
我是一名优秀的程序员,十分优秀!