none
vbs Performancevergleich datei schreiben und lesen

    Frage

  • Hallo,

    im Rahmen meiner Semesterarbeit (Thema Vergleich von virtualisierten und nicht virtualisierten System hinsichtlich der Performance) habe ich vbs-Skripte geschrieben, die die benötigten Zeiten für einzelne Schritte (Datei schreiben, Datei lesen, …) berechnet und diese dann in eine Logdatei schreibt.

    Jetzt sind 2 Fragen aufgekommen:

    1. Das Lesen der Datei dauert im Schnitt länger als das Schreiben beim selben Text.

    2. Beim Lesen habe ich wie erwartet einen Mittelwert und die Werte streuen darum. Beim Schreiben dagegen habe ich einen Hügel im Diagramm, den ich mir nicht erklären kann.

    Es wäre natürlich gut, wenn ich zu diesen Effekten etwas schreiben kann. Auch Stichworte können hier helfen, nach denen ich suchen könnte.

    Beide Effekte sind wiederholbar. Ich habe 50000 Datensätze ermittelt. Aber beide Effekte sind auch mit weniger Datensätzen vorhanden. Es ist also scheinbar kein Seiteneffekt wegen zu wenig Daten.



    Montag, 25. Februar 2019 09:22

Alle Antworten

  • Hi,

    wenn Du uns nicht sagst, was genau Du da mit welchem Code machst, können wir dir auch nicht sagen, ob Du einen Fehler in deinem Testszenario hast oder ob das evtl. an was anderem liegen könnte.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 25. Februar 2019 09:35
  • Hallo, ich gehe bei beiden Skripten folgend vor:

    1. Ich schreibe die aktuelle Zeit in eine Variable (Anfangszeit).

    2. Ich führe den zu messenden Arbeitsschritt aus.

    3. Ich speichere wieder die aktuelle Systemzeit in eine Variable (Endzeit).

    4. Beide Zeiten schreibe ich in eine Logdatei.

    Die beiden Diagramme werde ich posten, sobald ich Bilder posten darf. Jetzt muss wohl noch mein Konto überprüft werden.

    Skript Schreiben

    option explicit
    
    function WriteTimedataInLogfile(iBeginTime, iEndTime, sFileName)
    	if (iBeginTime = 0 and iEndTime = 0) then
    		WriteStringInFile "begin; end" + vbCrlf, sFileName, "append"
    	else
    		dim sLogText : sLogText = CStr(iBeginTime) + "; " + CStr(iEndTime) + vbCrlf
    		WriteStringInFile sLogText, sFileName, "append"
    	end if
    end function
    
    function CreateTmpFile(sFileName)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (not fso.FileExists(sFileName)) then
    		dim file : set file = FSO.CreateTextFile(sFileName, TRUE)
    		file.close()
    	end if
    end function
    
    function DeleteTmpFile(sFileName)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (fso.FileExists(sFileName)) then
    		fso.deleteFile (sFileName)
    	end if
    end function
    
    function WriteStringInFile(sText, sFileName, sMode)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (fso.FileExists(sFileName)) then
    		dim file
    		select case sMode
    			case "write"
    				set file = fso.OpenTextFile(sFileName, 2, 1)
    			case "append"
    				set file = fso.OpenTextFile(sFileName, 8)
    		end select
    		file.write sText
    	end if
    end function
    
    function sReadStringFromFile(sFileName)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (fso.FileExists(sFileName)) then
    		dim file : set file = fso.OpenTextFile(sFileName)
    		sReadStringFromFile = file.ReadAll()
    	end if
    end function
    
    dim iBeginTime
    dim iEndTime
    dim sFileNameReadText : sFileNameReadText = "text.txt"
    dim sFileNameLogfile : sFileNameLogfile = "PerformancelogLesen.txt"
    dim sText
    dim iCountLoopsMax : iCountLoopsMax = 50000
    dim i
    
    WriteStringInFile "", sFileNameLogfile, "write"
    
    WriteTimedataInLogfile 0, 0, sFileNameLogfile
    for i = 1 to iCountLoopsMax
    	sText = ""
    	iBeginTime = timer() * 1000
    	sText = sReadStringFromFile(sFileNameReadText)
    	iEndTime = timer() * 1000
    	WriteTimedataInLogfile iBeginTime, iEndTime, sFileNameLogfile
    next
    
    msgbox "end"

    Skript Lesen
    option explicit
    
    function WriteTimedataInLogfile(iBeginTime, iEndTime, sFileName)
    	if (iBeginTime = 0 and iEndTime = 0) then
    		WriteStringInFile "begin; end" + vbCrlf, sFileName, "append"
    	else
    		dim sLogText : sLogText = CStr(iBeginTime) + "; " + CStr(iEndTime) + vbCrlf
    		WriteStringInFile sLogText, sFileName, "append"
    	end if
    end function
    
    function CreateTmpFile(sFileName)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (not fso.FileExists(sFileName)) then
    		dim file : set file = FSO.CreateTextFile(sFileName, TRUE)
    		file.close()
    	end if
    end function
    
    function DeleteTmpFile(sFileName)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (fso.FileExists(sFileName)) then
    		fso.deleteFile (sFileName)
    	end if
    end function
    
    function WriteStringInFile(sText, sFileName, sMode)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (fso.FileExists(sFileName)) then
    		dim file
    		select case sMode
    			case "write"
    				set file = fso.OpenTextFile(sFileName, 2, 1)
    			case "append"
    				set file = fso.OpenTextFile(sFileName, 8)
    		end select
    		file.write sText
    	end if
    end function
    
    function sReadStringFromFile(sFileName)
    	dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    	if (fso.FileExists(sFileName)) then
    		dim file : set file = fso.OpenTextFile(sFileName)
    		sReadStringFromFile = file.ReadAll()
    	end if
    end function
    
    dim iBeginTime
    dim iEndTime
    dim sFileNameReadText : sFileNameReadText = "text.txt"
    dim sFileNameWritetext : sFileNameWritetext = "Ausgabedatei.txt"
    dim sFileNameLogfile : sFileNameLogfile = "PerformancelogSchreiben.txt"
    dim sText : sText = sReadStringFromFile(sFileNameReadText)
    dim iCountLoopsMax : iCountLoopsMax = 50000
    dim i
    
    WriteStringInFile "", sFileNameLogfile, "write"
    
    WriteTimedataInLogfile 0, 0, sFileNameLogfile
    for i = 1 to iCountLoopsMax
    	CreateTmpFile sFileNameWritetext
    	iBeginTime = timer() * 1000
    	WriteStringInFile sText, sFileNameWritetext, "write"
    	iEndTime = timer() * 1000
    	WriteTimedataInLogfile iBeginTime, iEndTime, sFileNameLogfile
    	DeleteTmpFile sFileNameWritetext
    next
    
    msgbox "end"

    Montag, 25. Februar 2019 10:00
  • Hi,

    was schon mal ganz schlecht ist, ist die massenhafte Erzeugung von Objekten innerhalb der Schleife und vor allem deren fehlende Entsorgung .

    Du solltest dir ein einziges Objekt vom Typ Scripting.FileSystemObject erstellen und dann immer nur mit dem arbeiten. Am Ende dieses auch bitte wieder über Set fso = Nothing entsorgen. Bei nur einem Objekt wie vorgeschlagen wäre das noch zu verschmerzen, bei 50.000 ist das richtig übel.

    Dasselbe gilt eigentlich für deine File Objekte, also das, was Du bspw. mit fso.CreateTextFile, ... erzeugst. Da ich nicht weiß, ob es gewünscht ist, auch die Zeit zur Erstellung der Objekte zu messen, kann ich nicht sagen, ob Du die Erstellung des Objekts auch auslagern solltest. Auf jeden Fall musst Du das Objekt nach Verwendung zwingend wieder korrekt schließen entsorgen. Also bitte deine File Objekte zumindest mit .Close schließen und mit Set ... = Nothing wieder entsorgen.

    Wenn Du das mal überarbeitet hast, poste bitte den neuen Code, dann schau ich nochmal drüber.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    • Bearbeitet Stefan Falz Montag, 25. Februar 2019 10:58
    Montag, 25. Februar 2019 10:50
  • Hallo, ich habe den Code überarbeitet. Die Erzeugung der Fileobjekte innerhalb der Schleife ist in Ordnung und das fso habe ich ausgelagert. 

    Skript Schreiben

    option explicit
    
    function WriteTimedataInLogfile(iBeginTime, iEndTime, sFileName, fso)
    	if (iBeginTime = 0 and iEndTime = 0) then
    		WriteStringInFile "begin; end" + vbCrlf, sFileName, "append", fso
    	else
    		dim sLogText : sLogText = CStr(iBeginTime) + "; " + CStr(iEndTime) + vbCrlf
    		WriteStringInFile sLogText, sFileName, "append", fso
    	end if
    end function
    
    function CreateTmpFile(sFileName, fso)
    	if (not fso.FileExists(sFileName)) then
    		dim file : set file = FSO.CreateTextFile(sFileName, TRUE)
    		file.close()
    		set file = nothing
    	end if
    end function
    
    function DeleteTmpFile(sFileName, fso)
    	if (fso.FileExists(sFileName)) then
    		fso.deleteFile (sFileName)
    	end if
    end function
    
    function WriteStringInFile(sText, sFileName, sMode, fso)
    	if (fso.FileExists(sFileName)) then
    		dim file
    		select case sMode
    			case "write"
    				set file = fso.OpenTextFile(sFileName, 2, 1)
    			case "append"
    				set file = fso.OpenTextFile(sFileName, 8)
    		end select
    		file.write sText
    		file.close()
    		set file = nothing
    	end if
    end function
    
    function sReadStringFromFile(sFileName, fso)
    	if (fso.FileExists(sFileName)) then
    		dim file : set file = fso.OpenTextFile(sFileName)
    		sReadStringFromFile = file.ReadAll()
    		file.close()
    		set file = nothing
    	end if
    end function
    
    dim iBeginTime
    dim iEndTime
    dim sFileNameReadText : sFileNameReadText = "text.txt"
    dim sFileNameWritetext : sFileNameWritetext = "Ausgabedatei.txt"
    dim sFileNameLogfile : sFileNameLogfile = "PerformancelogSchreibenTest.txt"
    dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    dim sText : sText = sReadStringFromFile(sFileNameReadText, fso)
    dim iCountLoopsMax : iCountLoopsMax = 50
    dim i
    
    WriteStringInFile "", sFileNameLogfile, "write", fso
    
    WriteTimedataInLogfile 0, 0, sFileNameLogfile, fso
    for i = 1 to iCountLoopsMax
    	CreateTmpFile sFileNameWritetext, fso
    	iBeginTime = timer() * 1000
    	WriteStringInFile sText, sFileNameWritetext, "write", fso
    	iEndTime = timer() * 1000
    	WriteTimedataInLogfile iBeginTime, iEndTime, sFileNameLogfile, fso
    	DeleteTmpFile sFileNameWritetext, fso
    next
    set fso = nothing
    
    msgbox "end"

    Skript Lesen

    option explicit
    
    function WriteTimedataInLogfile(iBeginTime, iEndTime, sFileName, fso)
    	if (iBeginTime = 0 and iEndTime = 0) then
    		WriteStringInFile "begin; end" + vbCrlf, sFileName, "append", fso
    	else
    		dim sLogText : sLogText = CStr(iBeginTime) + "; " + CStr(iEndTime) + vbCrlf
    		WriteStringInFile sLogText, sFileName, "append", fso
    	end if
    end function
    
    function CreateTmpFile(sFileName, fso)
    	if (not fso.FileExists(sFileName)) then
    		dim file : set file = FSO.CreateTextFile(sFileName, TRUE)
    		file.close()
    		set file = nothing
    	end if
    end function
    
    function DeleteTmpFile(sFileName, fso)
    	if (fso.FileExists(sFileName)) then
    		fso.deleteFile (sFileName)
    	end if
    end function
    
    function WriteStringInFile(sText, sFileName, sMode, fso)
    	if (fso.FileExists(sFileName)) then
    		dim file
    		select case sMode
    			case "write"
    				set file = fso.OpenTextFile(sFileName, 2, 1)
    			case "append"
    				set file = fso.OpenTextFile(sFileName, 8)
    		end select
    		file.write sText
    		file.close()
    		set file = nothing
    	end if
    end function
    
    function sReadStringFromFile(sFileName, fso)
    	if (fso.FileExists(sFileName)) then
    		dim file : set file = fso.OpenTextFile(sFileName)
    		sReadStringFromFile = file.ReadAll()
    		file.close()
    		set file = nothing
    	end if
    end function
    
    dim iBeginTime
    dim iEndTime
    dim sFileNameReadText : sFileNameReadText = "text.txt"
    dim sFileNameLogfile : sFileNameLogfile = "PerformancelogLesenTest.txt"
    dim sText
    dim iCountLoopsMax : iCountLoopsMax = 50
    dim i
    dim fso : set fso = CreateObject("Scripting.FileSystemObject")
    
    WriteStringInFile "", sFileNameLogfile, "write", fso
    
    WriteTimedataInLogfile 0, 0, sFileNameLogfile, fso
    for i = 1 to iCountLoopsMax
    	sText = ""
    	iBeginTime = timer() * 1000
    	sText = sReadStringFromFile(sFileNameReadText, fso)
    	iEndTime = timer() * 1000
    	WriteTimedataInLogfile iBeginTime, iEndTime, sFileNameLogfile, fso
    next
    set fso = nothing
    
    msgbox "end"

    Montag, 25. Februar 2019 16:52