Использование кэширования с AutomationElements не дает мне ускорения - умышленное или неправильное использование? - PullRequest
3 голосов
/ 17 мая 2011

Я пытаюсь увеличить скорость некоторых операций автоматизации пользовательского интерфейса.Я наткнулся на (не очень хорошо) документированную возможность кэширования.

Из того, что я понял, вся операция (если у вас большое 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 мс.

Почему это не работает?Как улучшить?

Спасибо за любые идеи !!!

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Я бы не ожидал, что эти два цикла будут сильно различаться по времени выполнения, поскольку в обоих случаях должны быть полностью пройдены дочерние элементы родителя (в первом явно, а во втором для заполнения кэша.) Я думаю, хотя то, что время, необходимое для цикла по массиву parent.CachedChildren, намного меньше, чем ваш исходный код обхода. В этот момент элементы должны быть кэшированы, и вы можете использовать их без повторного обхода дерева.

Суть в том, что вы не можете получить производительность бесплатно, поскольку вам нужно потратить время на фактическое заполнение кэша, прежде чем он станет полезным.

0 голосов
/ 26 июня 2012

На самом деле, недавно я нашел время, чтобы проверить это снова, а также с различными элементами пользовательского интерфейса.Для ускорения кэширования необходимо сначала указать все (и только) необходимые элементы.Существует реальная разница в производительности, если вы, например, посмотрите на ComboBox с 100 элементами внутри или что-то подобное, например, очень сложный графический интерфейс с множеством элементов на одном уровне иерархии - и вам действительно нужны данные от всех них.Итак, кеширование - это не решение для всего, а скорее инструмент оптимизации производительности, который должен применяться с… знанием ситуации, требований и внутренней работы.Кстати, говоря о производительности, я обнаружил, что каждый .current доступ к элементу пользовательского интерфейса занимает примерно 20 мс, поэтому для сложных операций это действительно может занять значительное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...