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

Why does creating a TagLib::FileRef only takes time the first time?

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

我注意到了一些有趣的事情。 重启后第一次,我的系统需要大约 100ms 和 500ms 来创建一个 TagLib::FileRef 对象。当我再次使用同一个文件创建一个 TagLib::FileRef 时,它需要 0 毫秒,即使在我重新启动音乐播放器之后也是如此。

这是我用来测试的函数:

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 以某种方式 "remembers" 对象。我怎样才能使 taglib 不记得并且实际上总是必须读取文件。

我想优化库扫描功能,我不想总是重新启动整个系统来检查代码更改如何影响第一个-运行扫描。

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

使用

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

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