| 

.NET C# Java Javascript Exception

3
Nachdem in der neuen dotnetpro zwar die Gewinner des dotnetpro-Contest 07/2011 stehen, aber keine Details zu deren Lösungen, dachte ich mir, ich nutze dieses Forum, um eine Fachsimpelei über die Aufgabe anzustoßen. Die Hauptfrage war ja letztlich:

Eine Methode
IEnumerable<SomeType> MyMethod()
soll über eine AppDomain-Grenze hinweg aufgerufen werden. Wie kann das Ergebnis möglichst schnell an den Aufrufer übertragen werden, wenn auf Aufrufer-Seite nur SomeType und das .NET-Framework referenziert werden dürfen?

Darauf haben die Gewinner - herzlichen Glückwunsch von meiner Seite! - offenbar eine Lösung gefunden, die ca. doppelt so schnell läuft wie einfach SomeType[] zurückzugeben. Mich würde interessieren, wie das geht. Ich habe die Frage hier bewußt so formuliert, um auch Nicht-dnp-Lesern die Möglichkeit zu geben, sich zu beteiligen. Falls außer mir und Florian, den ich auf der Teilnehmerliste entdeckt habe, noch weitere Einsender hier mitlesen, würde ich mich ansonsten aber auch freuen, wenn wir unsere Erfahrungen und Lösungswege miteinander teilen könnten.
14.09.2011
Matthias Hlawatsch 13,2k 4 9
2 Antworten
1
Inzwischen habe ich herausgefunden, wo die "Lösung" steht.

Es gibt sie noch, die dotnetpro-Newsgroups. Dort war lange nicht viel los, seit dem Relaunch von codekicker zumindest für mich gefühlt noch viel weniger. Ergo hab ich da lang schon nicht mehr vorbeigeschaut. Und da ich weder in der dnp 07/11 noch in dem oben auf der dnp-Homepage geteaserten Update-Artikel einen Link gefunden habe, ist mir die Existenz der neuen (?) Contest-Newsgroup entgangen. Dort werden die Lösungsansätze diskutiert. Die schnellsten Lösungen scheinen mit einem eigenen Enumerator zu arbeiten, wie ihn Carsten Jendro hier vorstellt.

Ich hatte noch keine Zeit, es durchzumessen, aber beim Draufschauen scheint mir, dass bei diesem Ansatz ein Teil der zeitfressenden Serialisierung erst beim Durchlaufen des Enumerators und damit nach dem Anhalten der Stoppuhr passiert. Persönlich finde ich das zumindest grenzwertig, was die Konformität zur Aufgabenstellung angeht, aber die dnp hat es akzeptiert, und letztlich war hier vor allem die Aufgabenstellung unsauber.

Was die Fragestellung hier angeht: ich hab es wie gesagt noch nicht ausmessen können, aber ich würde erwarten, dass die Lösung inklusive Ablaufen des Enumerators langsamer ist als die Array-Variante. Siehe dazu auch diese Diskussion bei stackoverflow.

Ansonsten: mir hat der Contest Spaß gemacht. Die "eigentliche" Aufgabenstellung habe ich so gelöst, dass ich die Datei zeilenweise eingelesen und die Zeilen dabei gleich mal nach dem ersten Buchstaben in Arbeitspakete gruppiert habe. Die Arbeitspakete habe ich dann parallel bearbeiten lassen, und zwar so, dass ich erst anhand der Rohdaten sortiert habe (einfache String-Sortierung auf die ganzen Zeilen, das Eingabeformat hat das glücklicherweise ermöglicht) und dann die Datenobjekte gleich der Reihe nach erzeugen konnte. Am Ende alle Ergebnisse wieder zusammensetzen, fertig. Rückgabetyp, wie schon geschrieben, City[], und auch alle anderen Aufzählungen waren Arrays.
15.09.2011
Matthias Hlawatsch 13,2k 4 9
1
Hi Matthias,

meine Lösung funktioniert im Grunde ähnlich wie Deine. Ich hab beim Einlesen noch optimiert, so dass ich effektiv nur soviele Zeichen einlese wie notwendig und mir den anschließenden Trim spare (das hat durchaus noch was gebracht). Gruppiert nach Anfangsbuchstaben, parallel verarbeitet, Join der Ergebnisse, Rückgabe, fertig.
Ich habe die Strings nicht mehr zeilenweise bearbeitet (auch durch die Optimierung beim Enelsen bedingt), sondern stufenweise gruppiert, sortiert und Ergebnisobjekte erzeugt. Rückgabetyp auch bei mir City[].

Ich für meinen Teil hab bei der Sache Neues gelernt, altes Wissen aufgefrischt und Spass gehabt. Das ist die Hauptsache.

Auch von meiner Seite herzlichen Glückwunsch an die Gewinner. Der nächste Contest kommt bestimmt...
15.09.2011
ffordermaier 8,4k 3 9
Der Trim waren dann anscheinend die zwei Plätze, die Du vor mir lagst ;-)

Die nächste Aufgabe hat es in sich, finde ich. Machst Du wieder mit? Ich hab schon eine Lösungsidee ;-) Und Fragen zu Aufgabenstellung und Host gibt es auch schon wieder - siehe Newsgroup.
Matthias Hlawatsch 15.09.2011
Klar mach ich wieder mit. Über Lösungsansätze hab ich mir auch schon ein paar Gedanken gemacht, aber noch nichts ausprobiert. Erstmal ein paar Tage im Hirn reifen lassen... wünsch Dir auf jeden Fall viel Erfolg!
ffordermaier 15.09.2011
2
Bitte die fehlerbereinigte Methode Safe.Process verwenden: http://www.dotnetpro.de/newsgroups/newsgroupthread.aspx?id=8097
tboerner 19.09.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH