2016-04-23 82 views
0

作为我用C++/Qt开发的音乐播放器的一部分,我使用taglib扫描所有音频文件以获取数据库的元数据。为什么创建一个TagLib :: FileRef只需要第一次的时间?

我注意到一些有趣的事情。 重启后第一次,我的系统需要大约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不记得并且总是实际上必须读取文件。

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

+0

我不认为这在Taglib中很神奇,它可能只是文件数据仍然在磁盘缓存中,因此只有RAM访问,但在第一次访问后不需要磁盘访问。 –

+0

最有可能只是一个需要时间来初始化的静态变量 – jpo38

+0

@ jpo38 r-mean表示在应用程序重新启动后它仍然很快 –

回答

0

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

清除磁盘高速缓存与

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 

使标签库从磁盘上的文件再次重读。

相关问题