2016-04-23 2 views
0

私はC++/Qtで開発中の音楽プレーヤーの一員として、taglibですべてのオーディオファイルをスキャンして、データベースのメタデータを取得しています。TagLib :: FileRefの作成に初めて時間がかかるのはなぜですか?

私は何か興味深いことに気付きました。 再起動後初めて、システムでTagLib :: FileRefオブジェクトを作成するのに約100msと500msかかります。同じファイルを再度使用して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 

でディスクキャッシュをクリアするには、もう一度ディスクから再読み込みファイルのtaglibます。

関連する問題