2016-04-23 83 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 

使標籤庫從磁盤上的文件再次重讀。

相關問題