3

我正在尝试提高一些 UI 自动化操作的速度。我偶然发现了(不太好)记录在案的缓存可能性。

据我了解,整个操作(如果你有一个大的 GUI 树)是如此缓慢,因为对于每一个函数调用都必须有一个进程更改(有点像进入内核模式,我想,速度方面?!)。所以..进来缓存。

只需告诉函数缓存一个元素及其子元素,然后以闪电般的速度处理它。(据我了解,您只有一次上下文更改,并一次组装您需要的所有数据。)

好主意,但是.. 它对我来说和未缓存的变化一样慢。我写了一些简单的测试代码,并没有看到改进。

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 ms。执行时间父缓存:1271 毫秒。

为什么这不起作用?怎么提高?

感谢您的任何想法!!!

4

2 回答 2

2

我不希望这两个循环在运行时间上有很大差异,因为在这两种情况下,父母的孩子都必须完全走动(第一个明确地,第二个填充缓存。)不过,我确实认为,遍历parent.CachedChildren数组所需的时间远低于您最初的步行代码。此时,元素应该被缓存,您可以使用它们而无需重新遍历树。

一般的观点是你不能免费获得性能,因为你需要花时间在缓存变得有用之前实际填充缓存。

于 2011-05-17T14:47:38.950 回答
0

实际上,最近我有时间再次检查它,并针对不同的 UI 元素进行检查。为了使缓存更快,首先必须指定所有(并且仅)需要的元素。例如,如果您查看一个内部有 100 个元素的 ComboBox 或类似的东西,例如一个非常复杂的 GUI,在同一层次结构级别上有很多元素 - 您实际上需要来自所有这些元素的数据,那么会有真正的性能差异。所以..缓存不是万能的解决方案,而是一种性能优化工具,必须与..有关情况、需求和内部工作的知识一起应用。顺便说一句,谈到性能,我发现每个 .current 访问 UI 元素大约需要 20 毫秒,因此对于复杂的操作,这确实可以达到相当长的时间。

于 2012-06-26T09:45:29.567 回答