Как часть музыкального проигрывателя, который я разрабатываю на C ++ / Qt, я сканирую все аудиофайлы с помощью taglib, чтобы получить метаданные для базы данных.
Я заметил кое-что интересное.
В первый раз после перезагрузки в моей системе для создания объекта TagLib :: FileRef требуется около 100 мс и 500 мс. Когда я снова использую тот же файл для создания 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 как-то «запоминает» объекты. Как я могу сделать так, чтобы taglib не запоминал и всегда фактически читал файл.
Я хочу оптимизировать функцию сканирования библиотеки и не всегда хочу перезапускать всю систему, чтобы проверить, как изменения в коде влияют на сканирование при первом запуске.
Как предположил Фрэнк Остерфельд, данные файла все еще находились в кеше диска.
Очистка дискового кэша с
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
заставляет taglib перечитать файл с диска снова.
Других решений пока нет …