Autor |
Beitrag |
ThomasLehmann
Hält's aus hier
Beiträge: 4
|
Verfasst: Do 27.12.12 11:42
Hallo Leute,
ich komme aus der Java/Swing Welt und da gibt es für Komponenten wie
JList, JTree und JTable Modelle über die eine Komponente bei Bedarf
den sichtbaren Bereich abfragen kann (Beispiel: Object getValueAt(int row, int column))
Ich habe bisher nicht gesehen wie das bei WPF/XAML funktioniert?
Für meine DVD's habe ich diese von XML in eine Liste gelesen und dann einfach dem
DataGrid zugewiesen. Schön das ich die Daten sehe und das es (relativ) einfach war,
aber was ist mit der Performance?
Macht das Framework schon alles alleine richtig oder gibt es hier auch einen
Modell Mechanismus? Sollte man den verwenden oder braucht man das nicht?
(Ich meine: ich sehe vllt. 50-70 Zeilen und die Komponente verwaltet diese nur, aber
das Modell hat ggf. alle Daten)
Ich habe über 400 DVD's und finde das Program etwas langsam (Scrollen).
Bei einem anderen Eintrag in diesem Forum las ich von Performance Problemen bei über
50.000 Elementen. Also bei 1000 DVD's hätte ich schon so meine Zweifel ...
(und mein Quellcode ist wirklich minimal -> Auszug siehe Anhang)
Könnte da jemand Bitte was dazu hilfreiches sagen?
Gibt es Artikel (www) und/oder Bücher die Ihr dazu empfehlen könnt?
Grüße und Danke im Voraus,
Thomas
ANHANG:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| private bool loadXml() { XElement element = XElement.Load(@"Resources/MoviesDatabase.xml"); if (null != element) { var temp = from dvd in element.Descendants("dvd") orderby dvd.Attribute("title").Value select new Movie { Title = dvd.Attribute("title").Value, Url = (null != dvd.Element("url"))? dvd.Element("url").Value: "", Runtime = Convert.ToInt32(dvd.Element("runtime").Value), Year = (null != dvd.Element("year-of-publication"))? Convert.ToInt32(dvd.Element("year-of-publication").Value):-1, AspectRatio = dvd.Element("aspect-ratio").Value, DirectedBy = (from directedBy in dvd.Descendants("directed-by") select directedBy.Value).ToList(), Actors = (from actor in dvd.Descendants("actor") select actor.Value).ToList(), Genre = (from genre in dvd.Descendants("tag") select genre.Value).ToList() };
_gridData = new List<Movie>(); foreach(Movie movie in temp) { _gridData.Add(movie); } return _gridData.Count > 0; } return false; }
private void Window_Loaded(object sender, RoutedEventArgs e) { dataGridMovies.ItemsSource = _gridData; } |
Zuletzt bearbeitet von ThomasLehmann am Fr 28.12.12 13:41, insgesamt 1-mal bearbeitet
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 28.12.12 00:49
Hallo ThomasLehmann!
Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien:
3.4 Frage formulieren - Der richtige Titel: | Formuliere den Betreff deiner Themen so, dass der Leser (und damit möglicherweise dein Helfer) anhand des Titels bereits weiß, worum es in diesem Topic geht. Titel wie z.B. "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" machen nicht neugierig auf mehr, ehrlich. Auch "HILFEEEE!!!!" hat sich bisher nicht bewährt. Wenn du ein Topic eröffnest ist es höchstwahrscheinlich, dass du Hilfe brauchst. |
Einfach unten in deinem ersten Beitrag auf  klicken und den Titel ändern. Danke dir!
_________________ >λ=
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Fr 28.12.12 04:45
Also ich denke, das Problem ist mehr, wie du deine Daten speicherst.
Kann sein, dass ich mich irre, aber ich denke, xml ist für größere Datenmengen ziemlich ungeeignet, weil es einfach zu langsam ist. In so einem Fall würde ich dann schon über eine SQL-Datenbank nach denken.
Oder, was vielleicht schneller ist, du serialisierst die Daten binär. Dann kannst du die gespeicherte Datei aber nicht mehr manuell in der Datei lesen.
Außerdem, warum speicherst du die Daten nicht gleich in Form dieser Liste, die du am Ende haben willst?
Ich muss zugeben, ganz verstanden habe ich deinen Code nicht, aber ich denke, dass das einfach eine kompliziertere Variante der normalen XML-Serialisierung ist: code-bude.net/2012/0...serialisierung-in-c/
Dafür brauchst du nur ein Objekt, das die Klasse XmlSerializer serialisieren kann und der Rest ist mit wenigen Zeilen Code getan.
Versuch das doch mal mit der dort beschriebenen Methode.
Was man aber nicht auf diese Weise serialisieren kann, ist z.B. die Klasse Dictionary<Key, Value>, aber eine Methode zu schreiben, die das kann, ist gar nicht mal so schwer und es gibt auch Beispiele im Netz.
Binäre Serialisierung würde bei dem Problem aber nicht hängen bleiben, ganz sicher bin ich mir da aber auch nicht
Probiere einfach mal aus, zu jedem Stichwort, das ich genannt habe, gibt es mehr als genug im Netz zu finden.
Und ein gutes Buch kann ich auch empfehlen:
openbook.galileocomp.../visual_csharp_2010/
Dort steht zwar nicht XML erklärt, aber diese einfache Methode der binären Serialisierung und die lässt sich recht einfach auf XML übertragen.
Allerdings sind alle Grundlagen sehr gut erklärt und dort findest du aber auch einige Kapitel zu WPF und ADO.Net, also die Arbeit in C# mit Datenbanken.
|
|
ThomasLehmann 
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 28.12.12 13:57
Ich lese einmal am Anfang eine XML Datei, aber danach sind die Daten in einer Liste der Form:
Quelltext 1:
| List<Movie> _gridData; |
Movie ist eine simple C# Klasse mit Properties. Dein Link ist mit Sicherheit interessant wenn ich
die Daten wieder wegspeichern will.
Ist es ein Performance Problem wie komplex die Daten sind und deren Darstellung? Für die Schausspieler habe
ich in der Klasse "Movie" eine Liste von Strings und die DataGrid Zelle verwendet eine Art ListBox (Basis Klasse davon).
Sobald ich das Gruppieren hinzu nehme braucht die Anwendung ein paar Sekunden bis sie etwas anzeigt.
Irgendetwas ist doch grundlegend falsch, nur was? (Die Darstellung selber ist einwandfrei)
Deswegen frage ich wie die Datenmodellierung gemacht wird. Die meisten Beispiele im WWW weisen dem DataGrid einfach
eine Daten - Liste zu und das war es. Offensichtlich ist das nur die halbe Wahrheit, ist das so?
Grüße
Thomas
Palladin007 hat folgendes geschrieben : | Also ich denke, das Problem ist mehr, wie du deine Daten speicherst.
Kann sein, dass ich mich irre, aber ich denke, xml ist für größere Datenmengen ziemlich ungeeignet, weil es einfach zu langsam ist. In so einem Fall würde ich dann schon über eine SQL-Datenbank nach denken.
Oder, was vielleicht schneller ist, du serialisierst die Daten binär. Dann kannst du die gespeicherte Datei aber nicht mehr manuell in der Datei lesen.
Außerdem, warum speicherst du die Daten nicht gleich in Form dieser Liste, die du am Ende haben willst?
Ich muss zugeben, ganz verstanden habe ich deinen Code nicht, aber ich denke, dass das einfach eine kompliziertere Variante der normalen XML-Serialisierung ist: code-bude.net/2012/0...serialisierung-in-c/
Dafür brauchst du nur ein Objekt, das die Klasse XmlSerializer serialisieren kann und der Rest ist mit wenigen Zeilen Code getan.
|
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Fr 28.12.12 19:19
Der Link beschäftigt sich sowohl mit dem speichern als auch laden aus einer Datei.
So ganz kann ich mir jetzt nicht vorstellen, wie du die Daten genau gespeichert werden. Eine Liste sollte eigentlich keine Probleme machen, wobei ich aber auch keine genaue Vorstellung habe, wie lange das nun bei rund 1000 Elementen dauert, da ich bisher nicht in so großen Maßstäben gespeichert habe.
Probiere doch einfach mal aus, ich würde da die binäre Serialisierung versuchen, solange du nicht die Original-Daten ungesichert verwendest, ist das ja kein Problem.
Und wenn du eine Datenbank verwendest, kann man das nicht so einfach erklären, da wäre wieder das Buch bei den ADO.Net-Kapiteln, am besten geeignet, die setzen aber SQL-Kenntnisse voraus.
|
|
ThomasLehmann 
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 04.01.13 18:29
Also, ich habe nun nochmals mit einer Stopwatch gemessen:
Das Laden der XML Daten mit LINQ kostet 95 ms. Am Ende ist eine Liste mit einer
Klasse Movie die die Daten hält. Serialisierung ist hier - meiner Meinung nach -
nicht das Thema; nach loadXML ist KEIN XML mehr in Verwendung.
Nachdem die Zeit ausgegeben wurde muss ich mehrere Sekunden warten (>= 10 Sekunden)
bis die Tabelle erscheint (406 Einträge).
Also: was ist das Problem?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public MainWindow() { var watch = Stopwatch.StartNew(); loadXml(); watch.Stop(); _logging.TraceEvent(TraceEventType.Information, 1, " Time Elapsed {0} ms", watch.ElapsedMilliseconds);
InitializeComponent(); } |
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Fr 04.01.13 20:45
Wie genau wird die Tabelle denn erstellt?
Was du auch machen kannst um dem Problem selber auf die Schliche zu kommen, ist das einzelne abmessen, wie lange ein bestimmter Code-Abschnitt zum bearbeiten benötigt. Und so kannst du dann das Problem eingrenzen, bis du den Teil hast, der so extrem Zeitaufwendig ist.
|
|
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Fr 04.01.13 21:28
Wie wäre es mit der Nutzung des Profilers? Du schreibst ja in C#, den Profiler findest du im Visual Studio unter Analysieren > Leistungsanalyse starten (oder ALT+F2).
_________________ Die Lösung ist nicht siebzehn.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Fr 04.01.13 22:20
Es gibt ein paar Stellen, an denen andere öhnliche probleme haben:
stackoverflow.com/qu...datagrid-performance
stackoverflow.com/qu...performance-concerns
krishnabhargav.blogs...and-performance.html
Wichtig ist wohl vor allem die Virtualisierung die zwar standardmäßig an ist, aber nicht immer auch sofort funktioniert.
|
|
|