Meine Anwendung schreibt einige Dateien auf die Disc, aber ich habe festgestellt, dass ich während dieses Vorgangs mit dem Schreiben bestehender Dateien fertig bin. Also, ich muss prüfen, ob die Datei zuerst existiert und dann etwas Logik durchführen.
Es könnte viele Dateien geben, und als solche wollte ich abschätzen, wie viel Aufwand (in Bezug auf die Zeit) der Einfluss wäre. Also habe ich eine Konsolenanwendung zum Testen erstellt.
Mein Code
%Vor%Also, wie Sie sehen können, führt es 2 Aktionen aus. Ich schreibe Dateien auf die Festplatte, die andere ist zu prüfen, ob die Datei bereits existiert und wenn nicht, dann schreibe auf die Disc.
Ein Screenshot meines Konsolenfensters (die Ergebnisse):
Wie Sie sehen können, ist es merkwürdig, dass es fast immer schneller ist, zuerst zu prüfen, ob die Datei existiert und sie dann zu schreiben, als direkt auf die Disc zu schreiben. Das hat mich verwirrt. Sicherlich macht das keinen Sinn. Warum verbessert dieses Extra über Kopf die Geschwindigkeit (wenn man bedenkt, dass File.Exists()
in meinem Code immer false zurückgibt, also wird das Schreiben nicht übersprungen)? Ich vermute einen Fehler in meinem Code, aber ich habe mir das eine Weile angesehen und ich kann keinen Sinn daraus machen.
Bearbeiten
Laut den Kommentaren habe ich die Reihenfolge ein wenig geändert, also führe ich jetzt erst den mit File.Exists()
check und dann den write only aus. Die Ergebnisse sind übertrieben (obwohl ich jetzt über 10000 anstelle von 1000 iteriere, wie im obigen Code):
Bearbeiten 2
@MatthewWatson hat einen Fehler in meinem Code festgestellt, den ich aktualisiert habe, um sicherzustellen, dass das Verzeichnis immer zuerst gelöscht wird. Das gleiche Problem besteht fort, aber bei einem stark reduzierten Auftreten noch ein dramatischer Unterschied in der Geschwindigkeit.
%Vor%
Zu viel Code, um einen Kommentar zu schreiben - die kurze Antwort ist, dass Exists + Write im Allgemeinen länger dauern sollte als nur schreiben (sogar für existierende Dateien).
Disk IO ist nicht sehr vorhersehbar (Zwischenspeichern, Aufwärmen, Maschinenlast, E / A-Warteschlangen, HDD / SSD-Modell usw.), führt jedoch Tests mit einer großen Anzahl von Iterationen (mehr als 1000) aus, die mehr als ein paar ms dauern sollte dir und Idee geben. Auf meinem Computer dauert Exists + Write im Allgemeinen länger, aber es gibt auch Ausnahmen - es könnte ein Seitenwechsel sein oder eine der VMs stören, wer weiß ....
Hier ist eine leicht modifizierte Testsuite mit 4 Szenarien: 1. neuer Ordner, nur schreiben 2. neuer Ordner, existiert + schreiben 3. vorhandene Ordner und Dateien (ab Schritt 2) nur schreiben 4. existierender Ordner und Dateien (ab Schritt 2) existiert + schreiben
Code unten:
%Vor% Überprüfen Sie selbst und sehen Sie, wie sich das Gerät an Ihrem Gerät verhält.
BTW: Kein Punkt in i++;
innerhalb für Schleifen.
Bearbeiten: textX2
code wurde festgelegt, um eine neue Datei (alternativer Name) zu erstellen, wenn die Datei existiert
Ihre Tests haben keine Aufwärmphase und Sie setzen die Existenzen außerhalb Ihrer Zeitpunkte ein. Ich denke, wenn Sie die gleiche Datei verwenden, kann sie irgendwo auf Betriebssystem- oder Hardware-Ebene zwischengespeichert werden. Um diesen Test besser zu machen:
Tags und Links c#