Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.207.133.13] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Прикр. сообщ.
#1
,
|
|
|
Выделил в отдельную тему, заслуживает. Автоудаление отменено.
|
Сообщ.
#16
,
|
|
|
На HDD разница оказалась лишь количественная, качественно картина та же. Впрочем, фигня это. Понятно, что условия должны быть одинаковы, но предварительный запуск, чтобы одинаковость условий подразумевала кешированность служебных записей тома, ни разу не достоверно отражают реальное положение дел на практике, когда такой кешированности обычно нет.
Поэтому я взял себя в руки и ребутал машину каждый раз. И ждал окончания всех стартовых процедур. Ну, т.е. до прекращения дисковых операций. В итоге рекурсивная версия выдала 114 секунд по разделу с ~20000 файлов *.c (при общем количестве ~615000), нерекурсивный, увы, аж, 172, т.е. в полтора раза медленнее. Надо будет ещё то же с SSD сделать. Но что-то мне подсказывает, что в Win10 дисковый драйвер давно уже оптимизирован именно под рекурсивный обход дерева каталогов. По крайней мере на NTFS, где файловые атрибуты (кроме атрибутов данных разве что) практически всегда лежат в MFT. Просто потому что приложения делают это обычно именно так. Добавлено P.S. На случай, если вдруг важно, учитывать ли разницу в регистре символов при поиске по маске, можно чуть переделать создание регулярки: std::regex mask(wildMask, noSens ? std::regex_constants::ECMAScript | std::regex_constants::icase : std::regex_constants::ECMAScript); Добавлено P.P.S. Если вдруг надо в ран-тайм определять, различает ли файловая система регистр символов в именах файлов, то тут возникают сложности, т.к. по-хорошему нужно учитывать нюансы локали пользователя, а это отнюдь не однозначная процедура. К примеру, разница между I и i в английском абсолютно не совпадает с таковой в турецком, где есть полный комплект из I, İ, i и ı. Так что я бы рекомендовал сделать предварительно std::locale::global(std::locale(".utf8")); fs::path tempName1(fs::temp_directory_path() / "CheckCaseSens"s), tempName2(fs::temp_directory_path() / "checkcasesens"s); std::ofstream(tempName1, std::ios::ate); std::ofstream(tempName2, std::ios::ate); bool isNoCaseSens = fs::equivalent(tempName1, tempName2); fs::remove(tempName1); if (!isNoCaseSens) fs::remove(tempName2); Добавлено Цитата mkudritsky @ Запросто подойдёт. Как и для любого динамически изменяющего свой размер массива, realloc() прекрасно умеет увеличивать размер массива указателей, если есть на это память, конечно. Другое дело, что это будет уже не список, но по факту массив указателей будет эффективней списка указателей. В отличие от массива std::string, который очень вряд ли будет эффективней списка std::string. Ясное дело, что тип char** не подойдет, так как непонятно - как эффективно выделять память для разного количества файлов? |
Сообщ.
#17
,
|
|
|
Цитата Qraizer @ Сделал. То же самое, как и ожидалось. Так что скорость дисковой подсистемы в общем-то влияет, конечно, но не качественно. Механизмы оптимизации размещения служебной информации на томе влияют куда сильнее. Допускаю, что на каком-нибудь FAT или ext4 будут совсем другие цифры. (Если у кого под рукой есть никсы, потестите, плз.)Надо будет ещё то же с SSD сделать. P.S. На томе SSD его вышеупомянутые 50000 файлов отбирались из общего количества без малого 765000. |