为什么创建TagLib :: FileRef只是第一次需要时间?

时间:2016-04-23 07:54:09

标签: c++ qt taglib

作为我使用C ++ / Qt开发的音乐播放器的一部分,我使用taglib扫描所有音频文件以获取数据库的元数据。

我发现了一些有趣的东西。 重启后第一次,我的系统需要大约100ms和500ms来创建TagLib :: FileRef对象。当我再次使用同一个文件创建TagLib :: FileRef时,即使重新启动音乐播放器,也需要0ms。

以下是我用来测试的功能:

bool suffixCheck(const QString &val)
{
    if (val.endsWith(".mp3")) {
        return true;
    }

    if (val.endsWith(".m4a")) {
        return true;
    }

    if (val.endsWith(".ogg")) {
        return true;
    }

    return false;
}

void doTaglibThing(const QString &path)
{
    if (suffixCheck(path)) {
        QElapsedTimer timer;
        timer.start();
        TagLib::FileRef f(path.toUtf8().data(),
                          true,
                          TagLib::AudioProperties::Accurate);
        Q_UNUSED(f);
        qDebug() << "End taglibThing" << timer.elapsed();
    }
}

这是为什么?我假设taglib以某种方式“记住”了这些对象。我怎样才能使taglib不记得并且总是必须读取文件。

我想优化库扫描功能,我并不总是想重新启动整个系统来检查代码的更改如何影响首次扫描。

1 个答案:

答案 0 :(得分:0)

根据Frank Osterfeld的建议,文件数据仍在磁盘缓存中。

使用

清除磁盘缓存
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

使taglib再次从磁盘重新读取文件。