Jeff.Jefferson Geschrieben 21. April 2011 Geschrieben 21. April 2011 Hallo Leute, Ich programmiere momentan ein Tool, welches alle Dateien aus zwei Verzeichnissen ausliest und diese mit einander vergleicht. Nun möchte ich die Performance verbessern. Nur habe ich dabei folgendes Problem: Wenn ich das Einlesen das 1. mal starte braucht das Programm ca 1 Minute. Wenn ich das Einlesen nun ein 2. mal starte braucht das Programm ca 10 Sekunden. Ich möchte aber für Testzwecke immer wissen wie lange das Programm beim 1. Durchlauf braucht. Ein Neu-Debuggen hilft da nicht. Ein Neustart von Visual Studio 2005 ebenso nicht. Ein Neustart des PC's schon. Nur ist es etwas lästig immer den PC neuzustarten. Kann ich den Speicher (denn ich gehe mal davon aus das sich das Programm die Dateien im Zwischenspeicher behält und es deshalb beim 2. Einlesen so schnell geht) nicht per Code (C# .Net 2.0) leeren? Mein Programm funktioniert wie folgt: Erstellung eines DirectoryInfo Objects vom anegegeben Pfad 1. Rekursive Suche nach allen FileInfo Objekten Für jedes FileInfo Object: Erstellung eines Datei-Objektes (Datei ist eine eigene Klasse mit Eigenschaften wie Version, Größe, LastWriteDate...) Abspeicherung des Datei-Objekts in eine List<Datei>. Selbes Vorgehen für Pfad 2 (in eine 2. Liste natürlich) Danach folgt der Vergleich der 2 Listen. Nach einem 1. Googlen habe ich folgendes versucht: Liste1= null; Liste2= null; System.GC.Collect(); GC.WaitForPendingFinalizers(); Und nochmal durchlaufen lassen. Jedoch friert weder meine Form1 (was ich eigentlich erwartet hätte durch GC.WaitForPendingFinalizers();noch braucht das Programm wieder so lange wie beim 1. Durchlauf. Ich hoffe ihr könnt mir helfen, Gruß Jeff Zitieren
SebastianB Geschrieben 21. April 2011 Geschrieben 21. April 2011 Hi, startest du das Programm über VS? Oder aus der erstellten .exe? Hinweis: Liste1.Dispose(); LG, Sebastian Zitieren
Jeff.Jefferson Geschrieben 21. April 2011 Autor Geschrieben 21. April 2011 Ersteinmal danke für die Antwort. meine Liste hat leider keine Dispose()-Methode... also die Liste1 bzw Liste2 sind List<Datei>-Objekte und Datei eine selbst definierte Klasse. starte aus VS, habe jedoch gerade die Exe aus dem Debug Order gestartet....braucht ebenfalls nicht die Anfangszeit :-( Zitieren
lilith2k3 Geschrieben 21. April 2011 Geschrieben 21. April 2011 (denn ich gehe mal davon aus das sich das Programm die Dateien im Zwischenspeicher behält und es deshalb beim 2. Einlesen so schnell geht) Alternativ: Vielleicht cached das Betriebssystem (was ja auch sinnvoll wäre) an dieser Stelle? Zitieren
Jeff.Jefferson Geschrieben 21. April 2011 Autor Geschrieben 21. April 2011 Alternativ: Vielleicht cached das Betriebssystem (was ja auch sinnvoll wäre) an dieser Stelle? Ich werd' dem mal nachgehen (Benutze WinXP - Aber falls jemand schon weiß wie man den OS Cache leert....tut euch keinen Zwang an es mitzuteilen ) Zitieren
SebastianB Geschrieben 21. April 2011 Geschrieben 21. April 2011 Ersteinmal danke für die Antwort. meine Liste hat leider keine Dispose()-Methode... starte aus VS, habe jedoch gerade die Exe aus dem Debug Order gestartet....braucht ebenfalls nicht die Anfangszeit :-( C# - Dispose implementieren Ersteinmal danke für die Antwort. starte aus VS, habe jedoch gerade die Exe aus dem Debug Order gestartet....braucht ebenfalls nicht die Anfangszeit :-( Erstell mal das Release-Build und versuche es damit. LG, Sebastian Zitieren
Jeff.Jefferson Geschrieben 21. April 2011 Autor Geschrieben 21. April 2011 C# - Dispose implementieren Ich hab mich da mal "eingearbeitet".....aber um ehrlich zu sein, verstehe ich es noch nicht so ganz. Ich habe mir mal dazu den msdn Eintrag zu IDisposable und Implementieren einer Dispose-Methode angeguckt. Die sind sich ja ziemlich ähnlich.... kannst du mir sagen, ob ich das so richtig verstanden habe? Laut msdn muss zunächst meine Klasse "Datei" von IDisposable erben. Somit wird doch aus dem Code void IDisposable.Dispose () { Dispose (true); GC.SuppressFinalize (this); } folgender: void Dispose () { Dispose (true); GC.SuppressFinalize (this); } die Close-Methode kann vernachlässigt werden? Ich versteh' nich ganz was im folgenden Code mit "Ressourcen freigeben" gemeint ist. protected virtual void Dispose (bool fDisposing) { if (fDisposing) { // Hier die verwalteten Ressourcen freigeben } // Hier die unverwalteten Ressourcen freigeben } Bei MSDN steht an dieser Stelle, dass ein anfangs initialisiertes Component Objekt: private Component component = new Component(); dort mit Dispose freigegeben wird. Das verwirrt mich....is dieses Component Objekt jetzt in msdn ein Platzhalter für meine Klasse "Datei" ? Oder ist damit wirklich ein allgemeines Component Objekt gemeint? Ich hoffe es macht nicht zu große Umstände mir da weiterzuhelfen Zitieren
Guybrush Threepwood Geschrieben 21. April 2011 Geschrieben 21. April 2011 Das hat auch nichts mit deinem Problem zu tun, denn sonst würde es spätestens bei einem Programmneustart wieder so lange dauern wie beim ersten mal. Zitieren
Jeff.Jefferson Geschrieben 21. April 2011 Autor Geschrieben 21. April 2011 Das hat auch nichts mit deinem Problem zu tun, denn sonst würde es spätestens bei einem Programmneustart wieder so lange dauern wie beim ersten mal. Das hab ich mir auch eben gedacht^^ dann wird das denk ich ma echt an Windows liegen.... Zitieren
lilith2k3 Geschrieben 21. April 2011 Geschrieben 21. April 2011 dann wird das denk ich ma echt an Windows liegen Unglaublich diese modernen Betriebssysteme ... halten Dateien einfach so auf Vorrat im Speicher Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.