вторник, 27 января 2009 г.

Чистка реестра и скорость работы системы, или наш ответ членберлену :)

В кругах пользователей операционной системы Windows бытует мнение, что использование всякого рода приложений для "чистки" реестра способно повысить производительность системы. На самом деле это заблуждение. Я бы сказал что это не совсем так, а скорее даже совсем не так :).
Прежде всего, стоит обратить внимание на внутреннее устройство реестра. Он так устроен, что поиск конкретного значения, к которому вы обращаетесь по определенному пути не занимает много времени. Каждый узел дерева хранит ссылки на своих потомков следующего уровня. Среди этих потомков и происходит бинарный поиск следующей ссылки в пути. Например, вам необходимо обратиться к ключу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32 и полусить его значения. Корневые кусты, такие как HKEY_LOCAL_MACHINE отображаются в область имен диспечера объектов и поэтому их искать не необходимости. Поэтому первый раз ищется сылка на ключ SOFTWARE среди ссылок первого уровня в HKEY_LOCAL_MACHINE. Найденый ключ имеет ссылки на всех своих потомков следующего уровня, среди которых при помощи бинарного поиска ищется ключ Microsoft, который в свою очередь хранит ссылки на своих потомков следующего уровня и так далее. Таким образом, если вы знаете путь к нужному вам ключу, то размер реестра заметно не повлияет на скорость обращения даже на таком логическом уровне, поскольку этот размер влияет только на количество записей на каждом следующем уровне, а использование бинарного алгоритма значительно ускоряет этот поиск: для поиска на уровне из 1023 элементов достаточно 10 сравнений. Кроме того тут следует учитывать, что данные, внутри которых производится поиск на момент его начала могут уже находиться в памяти, что значительно сэкономит время на операциях ввода-вывода.
Некоторые товарищи приводят в пример тот факт, что поиск некоего значения в реестре на вновь инсталлированой машине произходит значительно быстрее нежели на той, которая активно используется. То есть на, на "чистой" машине поиск несуществующего значения занимает минуту, а на рабочей, даже с учетом того что она мощнее контрольной, минуту и 24 сек ;). На самом деле объясняется это довольно просто. API для работы с реестром не предоставляет функций поиска. То есть, нельзя сказать системе: "найди мне такое-то значение". Можно только попросить у системы список подключей некоего ключа, а зетем, среди этих значений искать уже самому. Потом запрашивать следующий список и так далее. Грубо говоря regedit при подобном поиске использует не самый быстрый алгоритм работы с реестром. Немного погуглив я нашел в доказательство эту утилиту. Поиск при помощи regedit некоего значения по всем ключам происходит около 30 сек на моей супержелезяке. А эта утилита делает то же самое всего за 6 секунд. Это говорит о том, что полный поиск в реестре зависит исключительно от приложения, которое этот поиск осуществляет.
Таким образом выходит, что чистка реестра, с целью уменьшить количество записей в нем не даст ощутимого прироста в производительности.
Однако, справедливости ради замечу, что в некоторых случаях эта процедура полезна для борьбы со всякого рода остатками, например расширений explorer или IE, которые были неправильно удалены и ведут за собой проблемы именно с этими приложениями. В этом контексте "чистка" способна восстановить корректное функционирование различных приложений, если на это влияют "лишние" ключи.

Комментариев нет: