Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

Hi,

startest du das Programm über VS? Oder aus der erstellten .exe?

Hinweis: Liste1.Dispose();

LG,

Sebastian

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 :-(

(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?
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 :))

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

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 :rolleyes:

Jeff: Hast eine PM.

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....

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.