[AutoIt] Performance von xcopy messen

War-10-ck

střelec
Teammitglied
Registriert
14 Juli 2013
Beiträge
5.689
Ort
Schießstand
Hallo,
ich schreibe gerade ein kleines Script um die Performance von xcopy Prozessen zu berechnen. In diesem Fall: Performance = Dauer des Prozesses.
Es werden vier xcopy Prozesse nacheinander gestartet, jeweils wenn der vorherige beendet ist. Jeder Prozess hat einen eigenen Quell und Zielordner.

Folgendes vorgehen pro Prozess (also viermal):
- Timestamp nehmen
- xcopy starten
- auf Ende warten
- Timestamp nehmen
- Differenz berechnen
- (Zielordner wieder leeren)

Der letzte Schritt löscht den Inhalt des Zielordners um für den nächsten Start des Scripts wieder einen leeren Ordner bereitstellen zu können.
Was mich nun verwirrt: Leere ich den Ordner nach erfolgreichem Kopieren dauert der Kopiervorgang nur knapp halb so lange als wenn ich den Ordner nicht leere. Woran kann das liegen? Ich bin eigentlich recht sicher, dass es nicht an meinem Code liegt!, hab ich irgendwas übersehen?

PHP:
Expand Collapse Copy
For $i = 0 To $N_NUMBER_OF_COPY_PROCESSES - 1 Step +1
			$startTimestampArray[$i] = _NowCalc()
			ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i = ' & $i & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
			$nPidArray[$i] = _CopyDirectory($S_SOURCE_DIR & "_" & ($i + 1), $S_DESTINATION_DIR & "_" & ($i + 1))

			; wait for process end
			if ProcessWaitClose($nPidArray[$i], $N_WAIT_FOR_PROCESS_CLOSE_TIMEOUT) = 1 Then
				$endTimestampArray[$i] = _NowCalc()
				; calculate elapsed time for the copy process
				$nProcessDurationArray[$i] = _DateDiff('s', $startTimestampArray[$i], $endTimestampArray[$i])
				$nProcessDuration += $nProcessDurationArray[$i]
				; delete content of target folder
;~ 				_ClearDirectory($S_DESTINATION_DIR & "_" & ($i + 1))
			Else
				_Log("Wait for end of xcopy process timeout expired. PID: " & $nPidArray[$i] & " Timeout: " & $N_WAIT_FOR_PROCESS_CLOSE_TIMEOUT & " seconds")
				return -1
			EndIf
		Next

PHP:
Expand Collapse Copy
Func _CopyDirectory($sSourceDir, $sDestinationDir)
	Local $nPid = Run('xcopy "' & $sSourceDir & '" "' & $sDestinationDir & '" /e', "C:\", @SW_HIDE)
	if $nPid <> 0 Then
		return $nPid
	Else
		return -1
	EndIf
EndFunc

PHP:
Expand Collapse Copy
Func _ClearDirectory($sPathToDirectory)
	Local $Dirs = _FileListToArray($sPathToDirectory, '*', 2)
	Local $Files = _FileListToArray($sPathToDirectory, '*', 1)

	If $Dirs <> ''  Then
		For $x = 1 To $Dirs[0] Step 1
			DirRemove($sPathToDirectory & '\' & $Dirs[$x], 1)
		Next
	EndIf

	If Not ($Files = '')  Then
		For $z = 1 To $Files[0] Step 1
			FileSetAttrib($sPathToDirectory & '\' & $Files[$z], "-RHSAO")
			FileDelete($sPathToDirectory & '\' & $Files[$z])
		Next
	EndIf
EndFunc

Wenn etwas unklar ist bitte Fragen, bin gerade zu sehr in der Materie um mich klar auszudrücken befürchte ich.
 
Schwer zu sagen woran das liegen koennte. Kann mir aber vorstellen das es mit dem Filesystem zu tun hat. Vielleicht wird beim ersten Kopiervorgang der freie Platz erstmal zusammengesucht. Beim zweiten mal ist dann schon genug Luft entstanden und er Algorithmus kann schneller laufen. Ist aber nur ne Vermutung.
 
Also am Code liegt's (soweit ich den überflogen habe) nicht.

Was interessant wäre: Ändert sich was an der Dauer, wenn du die ?
 
  • Thread Starter Thread Starter
  • #5
Ändert nichts am Verhalten. Zeit bleibt gleich egal ob normales oder sicheres Löschen.
 
Der letzte Schritt löscht den Inhalt des Zielordners um für den nächsten Start des Scripts wieder einen leeren Ordner bereitstellen zu können.
Was mich nun verwirrt: Leere ich den Ordner nach erfolgreichem Kopieren dauert der Kopiervorgang nur knapp halb so lange als wenn ich den Ordner nicht leere. Woran kann das liegen?
Wenn noch Files im Zielordner liegen, dann muss xcopy bei jedem File entscheiden ob es überschrieben werden soll.
Wenn der Zielordner leer ist, dann entfällt dieser Schritt.
Mich wundert eh, dass du mit xcopy /e automatisiert überschreiben kannst.
Hast du die Option /y in der Umgebungsvariable COPYCMD gesetzt?
 
  • Thread Starter Thread Starter
  • #7
Bevor das Skript die eigentlichen Kopiervorgänge startet wird eh nochmal alles aus den Zielordnern gelöscht um ein Überschreiben zu verhindern. D.h. Ausgangszustand sind immer leere Zielordner damit auch tatsächlich nicht überschrieben wird. Daher ist der Löschprozess direkt nach dem Reinkopieren eigentlich auch redundant, mich wunderts nur, dass es sich so auswirkt.

Die Parameter von xcopy hab ich mitlerweile auf /O /X /E /H /K abgeändert, damit auch Schreibgeschützte Daten kopiert werden.
 
du kopierst aber immer die gleiche / gleichen dateien oder?
Die Datei hällt Windows 7 (falls es win7 ist ;)) im Cache vor und muss diese nicht noch mal in den Ram kopieren > kann schneller geschrieben werden.
Kann man recht gut im Recourcenmonitor sehen - unter Arbeitsspeicher sieht man einen schönen bunten Balken bei dem sich der "Standby" Anteil verändert wenn man größere Dateien kopiert.
 
Diese Cache-Geschichte kann man anscheinend mit Parameter /J abschalten.
Laut erst ab Windows Server 2008 R2 verfügbar. Müsste demnach auch ab Windows 7 SP1 drin sein?
 
  • Thread Starter Thread Starter
  • #10
Verstehe den Zusammenhang mit dem RAM hier nicht.

Ich habe vier Ordner (Source1, Source2, Source3, Source4) darin befinden sich jeweils die selben Daten. Diese werden dann nacheinander in die passenden Zielordner Destination1 - 2 - 3 & 4 kopiert. Hier ist es doch für den RAM unerheblich ob ich die Daten direkt nach jedem Kopiervorgang aus dem Destination Ordner lösche oder erst wenn alle vier kopiert sind. Ich würde denken, dass Windows die Daten in beiden Fällen im RAM belässt? Sehe da keinen Zusammenhang.
 
irgendwie blicke ich glaube ich nu auch nich mehr durch :D
Wann geht es doppelt so schnell? Wenn du den Ordner nach jedem kopieren löscht - oder wenn du am Ende löscht?
Wenn du nach dem kopieren das Ziel gleich wieder löscht geht der Cache evtl. davon aus das du die Datei nicht mehr brauchst und löscht sie von dort - dann müsste es aber langsamer sein wenn du immer gleich nach dem kopieren löscht.
Sonst ergibt das wirklich keinen Sinn :D
 
  • Thread Starter Thread Starter
  • #12
Jap full ack. :D Es wird schneller wenn ich nach dem Kopieren direkt lösche. Ich mach mal eine kleine Skizze wie es abläuft.

Hier das schnelle:

Lösche den Inhalt von Destination 1 2 3 4
Kopiere Daten von Source1 nach Destination1
Lösche Daten in Destination1
Kopiere Daten von Source2 nach Destination2
Lösche Daten in Destination2
Kopiere Daten von Source3 nach Destination3
Lösche Daten in Destination3
Kopiere Daten von Source4 nach Destination4
Lösche Daten in Destination4

-----------------------------------------------

Und hier das langsame:

Lösche den Inhalt von Destination 1 2 3 4
Kopiere Daten von Source1 nach Destination1
Kopiere Daten von Source2 nach Destination2
Kopiere Daten von Source3 nach Destination3
Kopiere Daten von Source4 nach Destination4
 
Du kopierst was von Source1 nach Destination1 und dann löscht du es? o.O
 
Achso, ich hätte den Anfangpost genauer lesen sollen, das war ja das gewünschte Ziel. Mea Culpa.
 
Zurück
Oben