gpt4 book ai didi

c++ - Taglib:性能和崩溃问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:34 26 4
gpt4 key购买 nike

我在我的 Qt 应用程序中使用 taglib 库 (1.7.2),从音乐文件夹中读取 mp3 文件的一些元数据。问题是我发现它很慢。

例如,这是代码:

QString path = "C:/Music/";
QDir d(path);
QStringList fileTypes;
fileTypes << "*.mp3" ;
d.setNameFilters(fileTypes);
QStringList pathList = d.entryList( QDir::NoDotAndDotDot | QDir::Files);

QTime t;
t.start();
foreach (QString fileName, pathList) {
fileName = path + fileName;
TagLib::FileRef *f = new TagLib::FileRef(fileName.toStdWString().c_str());
}
qDebug()<<t.elapsed();

此代码大约需要 11 秒来加载包含 400 首歌曲的文件夹,即每个文件大约需要 28 毫秒。这是一条很慢的线路:

TagLib::FileRef *f = new TagLib::FileRef(pathFile.toStdWString().c_str());

这么长正常吗?我试过使用多线程,但它没有改变任何东西,而且它不是来 self 的 PC,因为它足够强大。奇怪的是,一旦所有文件都已加载,下次再次加载文件夹时,它会立即完成(直到我重新启动操作系统)。


我还有一个问题。

有时,当没有设置标签时,应用程序崩溃,并输出:

HEAP[myapp.exe]: 
Invalid address specified to RtlFreeHeap( 0ED90000, 0ED92CC0 )

例如在下面一行:

if (!f->tag()->genre().isNull())

我使用的是 Windows 7。

谢谢。

最佳答案

Sometimes, when a tag is not set, the app crashes, and output...

这是 TagLib 中许多奇怪的设计决策之一。当没有标签时,AudioProperties 对象为 NULL。您必须忍受它并添加一些额外的代码来检查 NULL。

The weird thing is that once all the files have been loaded, the next time it load the folder again, it's done instantaneous (until i reboot the os)

这并不奇怪,因为 Windows 7 具有非常先进且非常激进的磁盘 I/O 缓存机制。一旦您“触摸”了该文件,它就会到达 RAM,并且在您下次访问它时 - 它几乎是瞬时的。 400 个 mp3 文件并不多,而且都适合 RAM。

11s to load a folder containing 400 songs

您必须执行 400 次磁盘寻道,这在典型的硬盘驱动器上通常需要 9-11 毫秒(是的,SSD 仅为 0.1 毫秒)。因此,如果文件夹碎片化,您至少有 10*400 = 4 秒的时间来“倒回”驱动器的磁头。由于 id3 标签可能出现在文件的开头和结尾,这实际上增加了两倍的读取次数(您必须倒回文件的末尾),从而给出 2 倍的时间(大约 8 秒)。

简历:阅读文件夹的时间接近现实。 TagLib 中有许多怪癖(例如 NULL 或无法重载允许的文件操作,例如从文件中读取),但它们是可以避免的。 TagLib 的功能非常好,并且在许多方面都是独一无二的(广泛的格式支持)。

关于c++ - Taglib:性能和崩溃问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284154/

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