Почему DirectorySearcher настолько медленный по сравнению с PrincipalSearcher?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему DirectorySearcher настолько медленный по сравнению с PrincipalSearcher?

Сообщение Anonymous »

В нашем приложении есть процесс, который извлекает всех пользователей из Active Directory и обновляет соответствующие таблицы SQL их информацией. Процесс выполняется по ночам, и он был написан несколько лет назад - так что это устаревший код, который работает, и «если он не сломан, не чините его». Однако мы добавляем в наше приложение новую функцию, которая требует внесения изменений в этот код, и, поскольку ее не трогали уже много лет, я подумал, что можно ее немного подчистить.
Указанный процесс запускается ТОЛЬКО ночью, за исключением редких сбоев сервера, в этом случае нам приходится запускать его вручную в течение дня. Для выполнения своей работы процесс использует старую добрую библиотеку System.DirectoryServices, и хотя она работает, работает довольно медленно.
Я подумал об использовании более новой библиотеки System.DirectoryServices. Вместо этого я начал переписывать весь процесс (несколько сотен строк кода) и был поражен, увидев, что PrincipalSearcher значительно превосходит DirectorySearcher.
Я пытался найти причину и наткнулся на следующий ответ SO, который дает сравнение между ними и утверждает, что DirectorySearcher должен быть быстрее, чем PrincipalSearcher code>.
Я запустил тестовый проект, чтобы убедиться, что у меня нет галлюцинаций:

Код: Выделить всё

class Program
{
static void Main(string[] args)
{
// New stuff
var context = new PrincipalContext(ContextType.Domain, "mydomain.com");
var properties = new[] { "cn", "name", "distinguishedname", "surname", "title", "displayname" };
var i = 0;
var now = DateTime.Now;

new Thread(delegate()
{
while (true)
{
Console.Write("\r{0} ms, {1} results", (DateTime.Now - now).TotalMilliseconds, i);
Thread.Sleep(1000);
}
}).Start();

using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
var underlying = searcher.GetUnderlyingSearcher() as DirectorySearcher;
underlying.PageSize = 1000;
underlying.PropertiesToLoad.Clear();
underlying.PropertiesToLoad.AddRange(properties);
underlying.CacheResults = false;

using (var results = searcher.FindAll())
{
foreach (var result in results)
{
i++;
}
}
}

Console.WriteLine("It took {0}", (DateTime.Now - now).TotalMilliseconds);
now = DateTime.Now;
i = 0;

// Old stuff
var root = new DirectoryEntry("LDAP://DC=mydomain,DC=com");
var filter = "(&(objectCategory=user)(objectClass=user))";

using (var searcher = new DirectorySearcher(root, filter, properties))
{
searcher.PageSize = 1000;
searcher.CacheResults = false;

using (var results = searcher.FindAll())
{
foreach (var result in results)
{
i++;
}
}
}

Console.WriteLine("It took {0}", (DateTime.Now - now).TotalMilliseconds);
}
}
При опросе нескольких тысяч пользователей результаты составили около 0,9 мс на пользователя с PrincipalSearcher (около 30 секунд для ~34 тыс. пользователей) и около 5,2 мс на пользователя с DirectorySearcher > (около 2 минут и 30 секунд для примерно 34 тысяч пользователей) — PrincipalSearcher работает почти в шесть раз быстрее.
Я пробовал отлаживать и сравнивать базовый PrincipalSearcher DirectorySearcher с тем, который я создал, и они показались очень похожими.
Я попробовал изучить дальше, и кажется, что если я использую корень поиска из PrincipalSearcher базовый поисковик, то созданный мною DirectorySearcher фактически превосходит PrincipalSearcher:

Код: Выделить всё

// ...

DirectoryEntry psRoot;

using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
var underlying = searcher.GetUnderlyingSearcher() as DirectorySearcher;
psRoot = underlying.SearchRoot;

// ...
}

// ...

using (var searcher = new DirectorySearcher(psRoot, filter, properties))
{
// ...
}
При отладке я обнаружил, что корни поиска во многом одинаковы, т. е. представляют один и тот же домен.
Что может повлиять на скорость поиска так тормозить?

Подробнее здесь: https://stackoverflow.com/questions/453 ... alsearcher
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»