c++ - QT - QFile 复制操作极其缓慢

标签 c++ qt qfile

我正在开发一个应用程序,需要使用 QT (5.6.1)

将大量文件从一个文件夹复制到另一个文件夹

为此,我一直在使用 QFile::copy() 方法。这很好用,除了一件事:它极度慢。使用 Windows 资源管理器执行相同的复制操作所需的时间是其两倍多。

想知道这是为什么,我深入研究了 QT 源代码,并在 qfile.cpp 中找到了这个,它看起来很相关:

char block[4096];
qint64 totalRead = 0;
while(!atEnd()) {
    qint64 in = read(block, sizeof(block));
    if (in <= 0)
        break;
    totalRead += in;
    if(in != out.write(block, in)) {
        close();
        d->setError(QFile::CopyError, tr("Failure to write block"));
        error = true;
        break;
    }
}

因此,据我了解,复制操作使用的是 4096 字节的缓冲区。这对于复制操作来说非常小,很可能是问题的原因。 所以我所做的是将缓冲区的大小更改为:

char block[4194304]; // 4MB buffer

然后我重建了整个 QT 库以包含此更改。但是,所做的所有修改都是完全破坏了该方法。现在,当我的应用程序尝试调用 QFile::Copy() 时,操作会立即中断(根据 QtCreator 的调试器,方法甚至没有开始运行,在第一行之前停止)。调试器告诉我:

The inferior stopped because it received a signal from the Operating System.

Signal name :
SIGSEGV
Signal meaning :
Segmentation fault

我的 c++ 有点生疏,但我不明白仅仅改变数组的分配大小怎么会完全破坏一个方法...任何人都可以通过以下任一方式提供帮助:

1) 告诉我为什么 QFile:Copy() 这么慢(我错过了什么吗?它不仅在我的 PC 上,还在几台不同的机器上测试过)。罪魁祸首实际上是我在上面发布的代码还是完全是其他东西? 2) 告诉我为什么那个改变完全破坏了 QFile

最佳答案

您的更改破坏 QFile 的原因是 4M 的缓冲区不适合堆栈(默认堆栈大小通常约为 1M)。一个快速的解决办法是:

std::vector<char> vec(4*1024*1024);
char *block = &vec.front();

vector 将在堆上分配大缓冲区(并在完成后负责释放),您只需将 block 指向 vector 的前面即可。

我认为您对为什么复制速度慢的分析很准确。

关于c++ - QT - QFile 复制操作极其缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39485537/

相关文章:

c++ - 同时就地 std::sort 键 vector 和值 vector

c++ - QT中如何让弹出窗口成为顶层窗口?

c++ - 非阻塞 worker - 中断文件复制

qt - 如何在Qt中创建一个具有完整路径的新文件?

c++ - 从文件读取时如何从行中单独读取每个数字

c++ - 移动数组指针不会改变起始地址

c++ - _Bool 和 bool : How do I solve the problem of a C library that uses _Bool?

qt - 我可以在Qt4.8.5中使用qt快速编译器吗

c++ - Qt 鼠标在 Label 上的坐标

c++ - 在 QFile 中写入文本