В моем коде у меня есть файловая база данных httpcache.db
, которую мое приложение считывает в память и записывает обратно на диск в один вызов API чтения / записи FILE i / o. Я читаю / пишу это, используя обычный fopen / fread. Я решил сжать его и посмотреть, приведет ли уменьшение размера к общему ускорению. Сначала я измерил время загрузки, которое требуется, чтобы прочитать httpcache.db
, и я получил довольно постоянное время 350 микросекунд. Размер файла httpcache.db
составляет 500 КБ. Затем я просто сжал его (размер httpcache.db.zip
стал 24 КБ) и попытался измерить время, необходимое для чтения файла. Сжатый файл занимает 90 микросекунд. Однако, согласно моим измерениям, распаковка этого файла займет около 1000 микросекунд (с общим значением 1090 микро против 350 микро).
Затем я попытался использовать вместо этого компрессор lz4 . Сжатый размер стал 40КБ. Однако при использовании lz4 распаковка моего исходного httpcache.db займет всего 80 микросекунд. Это выглядело как победа: 90 + 80 микросекунд против 350 до сжатия lz4. Просто чтобы убедиться, что все в порядке, я сделал последний прогон для проверки номеров, и, к моему удивлению, загрузка сжатого файла размером 40 КБ заняла бы столько же времени, сколько и исходный несжатый файл размером 500 КБ. Я проверил все и не обнаружил проблем с моим кодом: каким-то образом загрузка файла 40 КБ или 500 КБ заняла бы 350-400 микросекунд, а файла 24 КБ - 90. Единственная разница (кроме размера файла) заключалась в имени файла / расширении. Я просто переименовал сжатый файл lz4 из httpcache.db в httpcache.zip и, к моему удивлению, просто изменив расширение файла, внезапно «увеличило» ввод-вывод файла на 200%: загрузка 40 КБ httpcache.zip
файла займет 90 микросекунд, как и ожидалось.
После попытки разных вещей, кажется, что я получаю это медленное чтение, если расширение файла .db
или .bin
, и быстрое io, если расширение .zip
, .txt
или вообще не имеет расширения.
Очевидно, что windows каким-то образом портит файл io в зависимости от его расширения (я использую последний Win10 pro, работающий в bootcamp на 2020 macbook pro 16). Я отключил антивирус для папки, в которой находится файл, и все равно получил те же результаты. Есть идеи, что происходит и почему расширение файла так сильно влияет на файл io?
Это код, который я запускаю, чтобы измерить:
int main()
{
std::string fdataZip, fdata;
{
static const char dbName[] = "../data/httpcache.db.zip"; // 24KB
auto t0 = timeMicro();
readFile(dbName, fdataZip);
auto t1 = timeMicro();
LOG("%s load time: %lld micro", dbName, t1 - t0);
}
{
static const char dbName[] = "../data/httpcache.db"; // 40 KB
auto t0 = timeMicro();
readFile(dbName, fdata);
auto t1 = timeMicro();
LOG("%s load time: %lld micro", dbName, t1 - t0);
}
}
и readFile:
void readFile(const char* fileName, std::string& fileData)
{
fileData.clear();
if (FILE* fl = fopen(fileName, "rb"))
{
fseek(fl, 0, SEEK_END);
long length = ftell(fl);
fseek(fl, 0, SEEK_SET);
if (length > 0)
{
fileData.resize(length);
(void)fread(&fileData[0], 1, length, fl);
}
fclose(fl);
}
}
timeMicro
реализовано с использованием QP C тактовых импульсов.
Вывод из образца, который я получаю:
0:000 ... start
0:002 ../data/httpcache.db.zip load time: 97 micro
0:003 ../data/httpcache.db load time: 450 micro