标题:多线程拷贝整个目录速度能更快吗?原理是什么?
作者:stlcours
日期:2015-08-03 23:23
内容:
最近用QT做了一个小功能,就是拷贝整个目录,我已经把此函数写在线程里运行,大致代码如下:
void MyThread::CopyFolder(QString path) {
if (!QDir(path).exists()) return;
// 过滤器
QStringList filters;
QDirIterator dir_iterator(path,
filters, // hang 如果不想加入过滤器,定义一个空过滤器即可
//QDir::DirsFirst | NoFilter,
// QDir::AllDirs,
// QDir::DirsFirst | QDir::NoDotAndDotDot | QDir::AllEntries | QDir::CaseSensitive
QDir::NoDotAndDotDot | QDir::AllEntries | QDir::Hidden | QDir::System, // 默认传输隐藏文件
QDirIterator::Subdirectories);
while(dir_iterator.hasNext())
{
dir_iterator.next();
// 跳过少部分不想要的文件
const QFileInfo file_info = dir_iterator.fileInfo();
// 真正拷贝
if (file_info.isFile()) {
// 拷贝文件,主要是使用QFile::copy函数
}
else if (file_info.isDir()) {
// 创建目录,主要是使用QDir::mkdir函数
}
}
}
----------------------------------------------------------------
据我所知,多线程的出现,主要是为了利用CPU空闲时间,因为各种外设的速度相当于CPU来说太慢。但是如果我把这个目录拷贝函数写成多线程的话(假设我先 ..
#1 [彩阳 08-04 00:34]
机械硬盘才会出现IO性能瓶颈,固态硬盘不会;
此外,多线程IO如果运用的是多核CPU的话,效率会高一些,但是还是和IO相关。要知道IO是效率比较低的操作。
可以看看有关多线程IO的相关文章:http://blog.csdn.net/hmsiwtv/article/details/24598305
也可以看看并行程序相关的文章:http://www.opengpu.org/forum.php?mod=viewthread&tid=16490
#2 [dosmlp 08-04 08:53]
如果是机械硬盘并不会提高效率,即使程序性能提高了,到了硬盘这个物理层还是要排队读写 的
#3 [zgfree 08-04 10:56]
应该会快一些,系统会先写缓存,再一次写磁盘。
#4 回 彩阳 的帖子 [stlcours 08-04 15:45]
彩阳:机械硬盘才会出现IO性能瓶颈,固态硬盘不会;
此外,多线程IO如果运用的是多核CPU的话,效率会高一些,但是还是和IO相关。要知道IO是效率比较低的操作。
可以看看有关多线程IO的相关文章:http://blog.csdn.net/hmsiwtv/article/details/24598305
也可以看看并行程序相关的文章:h .. (2015-08-04 00:34)
大多数人仍然都是用机械硬盘啊,这点必须考虑到。正如你推荐的文章里写道:
>>唯一需要考虑的,单线程异步IO可能对多核CPU的利用不如传统的多线程充分。
拷贝这个事情,当然是CPU不密集的,主要都是IO的操作。所以多线程拷贝其实没有优势,甚至还有损失。尽管楼下说硬盘有缓存,可是硬盘的缓存都是很小的,通常都只有32M而已,无法抵消IO疲于奔命的劣势。
并行编程的原理我都懂,但绝大多数都是为了CPU密集的情况,或者就是让客户机及时得到服务器的相应,但我这里不是这种情况。
#5 回 dosmlp 的帖子 [stlcours 08-04 15:47]
dosmlp:如果是机械硬盘并不会提高效率,即使程序性能提高了,到了硬盘这个物理层还是要排队读写 的 (2015-08-04 08:53)
当然是机械硬盘,因为这是大多数客户机的情况,不是服务器应用。其实我觉得不仅效率不会提高,而且还会降低,不是吗?