Указанный процесс запускается ТОЛЬКО ночью, за исключением редких сбоев сервера, в этом случае нам приходится запускать его вручную в течение дня. Для выполнения своей работы процесс использует старую добрую библиотеку 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);
}
}
Я пробовал отлаживать и сравнивать базовый 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