Ich versuche, die Geschwindigkeit einiger UI-Automatisierungsvorgänge zu erhöhen. Ich bin über die (nicht so gut) dokumentierte Möglichkeit des Caching gestolpert.
Soweit ich das verstanden habe, ist die ganze Operation (wenn man einen großen GUI-Baum hat) so langsam, weil für jeden einzelnen Funktionsaufruf ein Prozesswechsel stattfinden muss (ähnlich wie im Kernel-Modus, nehme ich an, geschwindigkeitsmäßig?!). Also kommt Caching ins Spiel.
Sagen Sie der Funktion einfach, dass sie ein Element und seine Kinder zwischenspeichern soll, und arbeiten Sie dann blitzschnell daran (soweit ich weiß, haben Sie nur einen Kontextwechsel und stellen alle benötigten Daten in einem Zug zusammen).
Gute Idee, aber es ist für mich genauso langsam wie die nicht gecachte Variante. Ich schrieb einige einfache Testcode, und konnte nicht sehen, eine Verbesserung.
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
Der Aufbau ist folgender: Sie erhalten ein Element und wollen alle seine (vielen) Geschwister überprüfen. Beide Implementierungen, ohne und mit Cache, sind gegeben.
Die Ausgabe (Debug-Modus): Ausführungszeit ohne Cache: 1130 ms. Ausführungszeit parentcache: 1271 ms.
Warum funktioniert das nicht? Wie kann man es verbessern?
Danke für jede Idee!!!