Silverlight 4 unter XP: kleines Ups bei String.IndexOf

In einer Lösung werden auf eine Benutzereingabe hin ca. 10.000 (eher weniger) Zeichenketten (einige kurz, einige länger, aber im Mittel sicher nicht mehr als 200 Zeichen) darauf untersucht, ob sie eine andere Zeichenkette (im Beispiel 7 Zeichen) enthalten. Dazu wird String.IndexOf verwendet. Unter Vista geht das so schnell, dass man praktisch keine Verzögerung zwischen Beginn der Suche und dem Ergebnis sieht – daher hatte ich für den einfachen Test auch nicht nach eleganteren Möglichkeiten der Suche Ausschau gehalten. Bei gleicher Hardware unter XP dauert die Operation insgesamt aber etwa 30 (!!!) Sekunden – ich schätze mal, mindestens ein Faktor 100 langsamer.

Um auszuschliessen, dass es an den Daten liegt, habe ich das IndexOf naiv über ToCharArray() und einen wirklich primitiven Suchlauf gemacht – einfacher geht es nicht: erstes Zeichen des Suchbegriffs suchen und schauen, ob die Folgezeichen stimmen und wenn nicht ein Zeichen weiter neu suchen etc. Schlechter kann die Silverlight Implementierung eigentlich nicht sein – ist sie aber: hier gibt es nun auch unter XP keine Verzögerung mehr!

Dies als kleine Warnung: selbst auf Microsoft Plattformen scheint Silverlight nicht so furchtbar plattformunabhängig zu sein und hier geht es um eine primitive Laufzeitmethode!

Jochen

PS: Habe ich wohl nicht ausreichend respektive falsch recherchiert, ist ja schon länger bekannt. Sorry!

VCR.NET goes Silverlight?

Nein, nicht wirklich. Aber da ich mich in Silverlight 4 einarbeiten wollte, um einige Konzepte zu verstehen, habe ich mir als lebendes Beispiel VCR.NET ausgesucht. Nutzbar ist das Ergebnis wohl nur in einem sehr engen Rahmen, da es wirklich nur eine technische Studie vor dem Hintergrund eines knappen Zeitbudgets ist. Aber wer mal reinschauen möchte, kann sich die beiden Dateien von hier in sein VCR.NET Installationsverzeichnis kopieren, der Aufruf erfolgt mittels http://localhost/VCR.NET/Silverlight.html – Silverlight 4 muss natürlich lokal installiert sein. Die Quellen sind wie gewohnt öffentlich verfügbar. Die Nutzung erfolgt ohne Gewähr, ich hatte keine Zeit, alle technischen VCR.NET Aspekte bis auf’s Letzte zu prüfen – ich werde den Client jetzt mal für das nutzen, was er kann und evtl. einen Update nachschieben. Die Studie versteht sich als solche und wird nicht Teil der nächsten VCR.NET Version sein.

Hier einfach so ein paar Aspekte des Clients in bunt gewürfelter Reihenfolge – Silverlight, VCR.NET, Technik, …

  • * Ein definiertes Ziel war es, im Oberflächenbereich soviel wie möglich auf XAML zu setzen und so wenig wie möglich Code zu schreiben. Das ist nur zum Teil gelungen, da vor allem die Programmzeitschrift doch einiges an Logik erfordert.
  • * Als nützlich hat sich die gemischte Nutzung von vordefinierten (App.xaml) und programmatischen (App.Resources) Ressourcen erwiesen. Es scheint allerdings etwas kniffeliger zu sein, letztere in der Startphase zur Nutzung in XAML zur Verfügung zu stellen
  • * Bei den Einstellungen habe ich ein wenig mit den Formularmöglichkeiten herumgespielt, etwa mit der Validierungsinfrastruktur oder dem praktischen Label Control.
  • * Grundsätzlich sollte alles für eine einfache Übersetzung in andere Sprachen (Lokalisierung) vorbereitet sein.
  • * Auf Deployment Techniken wie Bibliotheken bin ich bewußt nicht eingegangen.
  • * Einer der zwei wichtigen Aspekte der Studie ist die Programmzeitschrift mit ihren Filtermöglichkeiten. Hier gab es einige Ärgernisse von Silverlight vs. WPF zu ignorieren (in einer ComboBox kann man ohne weiteren Code nicht über Tasteneingaben auswählen) oder zu umgehen (die Gruppierung der Ergebnisliste nach Tag und Stunde – Gruppierungen kennt in Silverlight erst einmal nur das DataGrid). Ganz nett war es zu sehen, wie einfach man aus einem ItemsControl eine Art ListBox machen kann, die ein Auswahlfeedback bietet.
  • * Die Liste der geplanten Aufzeichnungen ist eher langweilig, hier habe ich ein bißchen mit dem DataGrid experimentiert. Ganz interessant ist die Detailanzeige von Mehrkanalaufzeichnungen, die sich auf die Ausawhl einer Aufzeichnung öffnet. Hier sind man genau, welche anderen Aufzeichnungen verhindert oder parallel aufgezeichnet werden.
  • * Meine erste Aktion war der Navigationsknopf zum Blättern, der optisch ein wenig (nicht mehr) hermachen sollte. Er blendet sich auch fast vollständig aus, wenn die Maus nicht gerade auf ihm steht.
  • * Die Animation beim Blättern ist ein reiner Test – vermutlich in der Praxis eher nervig.
  • * Es werden auch die laufenden Aufzeichnungen angezeigt. Hier war aber die Zeit zu Ende und außer genau der Anzeige kann man nicht viel machen.
  • * Im XAML wird an vielen Stellen mit Konvertern (IValueConverter) gearbeitet, vor allem zur Anzeige von Uhrzeiten (VCR.NET verwendet grundsätzlich GMT / UTC und nicht die lokale Zeitzone) oder der Auswahl von Symbolen. Richtig eingesetzt sind Konverter trotz einfachster Codierung offenbar eine starke Waffe zur Unterstützung der Dynamik – man siehe auch diesen Artikel.
  • * Die Trennung zwischen Layout und Inhalt ist sicher noch unzureichend. Zwar habe ich viel auf Styles gesetzt, aber enthalten diese dann doch zum Teil wieder Bezüge zu ihrer Umgebung – unschön, das geht sicher auch professioneller.
  • * Beim Anbindung des SOAP Web Services vom VCR.NET hat es sich als nützlich erwiesen, dass alle generierten Klassen partial sind. So konnte etwa das EPGEvent so erweitert werden, dass neu hinzugefügte Eigenschaften direkt in XAML Bindings referenzierbar sind.

Ok, das war sicher nicht alles, muss aber für jetzt reichen!

Viel Spaß

Jochen