要在机械硬盘存储下优化您的代码,以达到 10ms 的执行时间,您可以考虑以下几个方面:
1. 减少锁的开销
如果可能,尽量减少对 m_mutexImgInfoList
的锁定。您可以先检查 m_imgInfoList.size()
是否大于零,然后再进行锁定,并确保在最小范围内使用锁。
if (!m_abort && !m_imgInfoList.isEmpty()) {
m_mutexImgInfoList.lock();
if (!m_imgInfoList.isEmpty()) {
info = m_imgInfoList.takeFirst();
}
m_mutexImgInfoList.unlock();
// 检查info.mat2D是否为空
...
}
2. 使用缓存机制
如果保存过程比较耗时,可以考虑引入一个缓冲区,将多个图像数据合并后一起写入文件,而不是每次都单独写入。例如,可以每处理一定数量的图像后再调用 imwrite()
保存到磁盘,这样可以有效地减少I/O操作的次数。
3. 调整图像格式和质量参数
调整保存图像的格式或质量参数,例如将 JPEG 的质量设置为较低(例如 75),以减小文件大小,提高保存速度,但注意这会影响最终图像的质量。
4. 图像压缩和解压方式
如果可行的话,考虑使用其他更快速的库或算法来进行图像的压缩和保存。例如,有些库对于某些格式可能会有更快的实现。
5. 异步处理
将图片保存操作放到另一个线程中异步进行。这将使主线程不被阻塞,继续处理其他任务。
示例:
// 在 Worker 类中
void saveImageAsync(const ImageInfo &info) {
QString savePath;
if (IMAG_JPG == info.imageType) {
savePath = info.imgPath + "/" + info.imgNo + ".jpg";
} else if (IMAG_BMP == info.imageType) {
savePath = info.imgPath + "/" + info.imgNo + ".bmp";
} else {
savePath = info.imgPath + "/" + info.imgNo + ".jpg";
}
QDateTime start = QDateTime::currentDateTime();
cv::imwrite(savePath.toStdString(), info.mat2D); // Save in a separate thread
qint64 elapsed = start.msecsTo(QDateTime::currentDateTime());
qDebug() << "Save time:" << elapsed << "ms";
}
然后在循环中调用该函数:
while (!m_abort) {
ImageInfo info;
if (!m_imgInfoList.isEmpty()) {
...
// 使用新线程异步保存图像
QtConcurrent::run(&saveImageAsync, info);
}
QThread::usleep(1);
}
6. I/O 优化
确保您的 I/O 操作在高效状态下工作,如确保不受磁盘碎片影响,以及适当配置操作系统以优化文件读写性能。如果多次连续写同一目录,尽量避免频繁创建、删除文件夹等。
通过这些方法结合实际场景逐渐优化,你应该能够降低整体耗时,接近目标。在实现之前,请确保做好充分测试,以验证各项改动带来的影响。
内容由零声教学AI助手提供,问题来源于学员提问