При открытии файла Wine выполняет stat по его имени, если не находит (допустим, из-за несовпадения регистра), начинает выполнять полный перебор. Предлагаю сделать тест, чтобы понять степень ущерба при тысяче файлов в каталоге. Конечно, предварительно тест должен измерять время поиска при совпадении регистра файлов. Имена файлов должны генерироваться, и поиск должен выполняться по всем файлам. При обнаружении существенного замедления можно рассмотреть несколько идей: - сначала перебор файлов делать по маске R*.*, где R - первая буква названия файла, инвертированная по регистру, а потом по маске N*.*, где N - первая буква названия файла. - пробовать открывать (stat) файл с названием, полностью приведённым к нижнему регистру (и для больших баз рекомендовать переименовывать все файлы) - на определённое время кэшировать для каталога информацию о содержащихся в нём файлах. Это поможет в случае массированного (тысячи файлов) открытия файлов подряд в одном каталоге.
Приступаю к выполнению
Создаю отдельный тест для определения выполнения поиска по файлам.
Определил создание папки, в ней происходит генерация тысячи файлов (имена файлов случайны). Определил функцию поиска файла по маске. Для тысячи фалов составляет 8 мс.
Вследствие несоответствия программы поставленной задаче, вношу изменения.
С использованием функции MSTART для определения времени выполнения функции stat получил следующие результаты : - при совпадении регистра 120.691 мкс - при несовпадении 0.160 мкс Задача выложена на git.eter:/people/grosso/packages/eterforcetest.git
(В ответ на comment #5) > С использованием функции MSTART для определения времени выполнения функции stat > получил следующие результаты : > - при совпадении регистра 120.691 мкс > - при несовпадении 0.160 мкс > Задача выложена на git.eter:/people/grosso/packages/eterforcetest.git Данная задача выполнена неверно (программа eterforcetest stat не является рабочей ) входе исправления, обнаружил ошибку удаления созданных файлов и определения времени обращения к файлу при совпадении и несовпадении регистров. После исправления получил следующие результаты: - при совпадении регистра 104.246 мкс - при несовпадении 105.131 мкс как видим из результатов замедления обращения к файлу практически нет. Выложил на it.eter:/people/grosso/packages/timetests.git
Написал в рассылку wine-devel@ замечания по коммиту.
Внес исправления. Отправил на git.eter:/people/grosso/packages/eterforctest.git.
(В ответ на comment #8) > Внес исправления. Отправил на > git.eter:/people/grosso/packages/eterforctest.git. Просьба всегда копировать пути и пр., а не писать руками. Это лишает возможности сделать опечатку. Также неплохо приводить результат выполнения теста. Давай ты напишешь в эту багу сначала на русском, что должен проверить тест, и как он это делает. Потом посмотрите с Ромой на описание и на результат, и когда вам обоим станет казаться, что задача решена, тогда присылай ещё раз. И прочитай ещё раз мои замечания, которые я отправлял. Половина не учтена, в том числе по самой сути тестируемых функций. Цель — проверить время открытия файла функцией CreateFile, а не что-то другое.
Новый вариант выложил на git.eter:/people/grosso/packages/eterforcetest.git
Получил результаты : - при совпадении регистра 252.286mks - при несовпадении 375.571mks
Задача решена
Принял патч в репозиторий, опубликовал.