为什么第一次创建 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 再次从磁盘重新读取文件。
作为我使用 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 再次从磁盘重新读取文件。