Я пытаюсь увеличить скорость некоторых операций автоматизации пользовательского интерфейса.Я наткнулся на (не очень хорошо) документированную возможность кэширования.
Из того, что я понял, вся операция (если у вас большое GUI-дерево) очень медленная, потому что для каждого вызова функции естьбыть изменением процесса (вроде как переход в режим ядра, я полагаю, по скорости ?!).Итак ... in приходит кеширование.
Просто скажите функции кэшировать элемент и его дочерние элементы, а затем работать с ним молниеносно.(Из того, что я понимаю, у вас есть только одно изменение контекста, и вы собираете все необходимые данные за один раз.)
Хорошая идея, но ... для меня это так же медленно, как и для кешированного варианта.Я написал несколько простых тестовых кодов и не смог увидеть улучшения.
AutomationElement ae; // element whose siblings are to be examined, thre are quite a few siblings
AutomationElement sibling;
#region non-cached
watch.Start();
for (int i = 0; i < 10; ++i)
{
sibling = TreeWalker.RawViewWalker.GetFirstChild(TreeWalker.RawViewWalker.GetParent(ae));
while (sibling != null)
{
sibling = TreeWalker.RawViewWalker.GetNextSibling(sibling);
}
}
watch.Stop();
System.Diagnostics.Debug.WriteLine("Execution time without cache: " + watch.ElapsedMilliseconds + " ms.");
#endregion
#region cached
watch.Reset();
watch.Start();
CacheRequest cacheRequest = new CacheRequest();
cacheRequest.TreeScope = TreeScope.Children | TreeScope.Element; // for testing I chose a minimal set
AutomationElement parent;
for (int j = 0; j < 10; ++j)
{
using (cacheRequest.Activate())
{
parent = TreeWalker.RawViewWalker.GetParent(ae, cacheRequest);
}
int cnt = parent.CachedChildren.Count;
for (int i = 0; i < cnt; ++i)
{
sibling = parent.CachedChildren[i];
}
}
watch.Stop();
System.Diagnostics.Debug.WriteLine("Execution time parentcache: " + watch.ElapsedMilliseconds + " ms.");
#endregion
Настройка: вы получаете элемент и хотите проверить все его (многие) братья и сестры.Даны обе реализации, без кеша и без него.
Вывод (режим отладки): Время выполнения без кеша: 1130 мс.Время выполнения родительского кэша: 1271 мс.
Почему это не работает?Как улучшить?
Спасибо за любые идеи !!!