Hallo Rings,
Wie ich sehe, hast du den crunch teil in einer (While) schleife gesteckt.
Das kostet aber extra zeit. Um einen fairen test durchzuführen, sollte
der code aber stets gleich bleiben und nur die Syntax der packer
ausgetauscht werden. Dazu habe ich mal ein example gemacht.
Es ist GUI gesteuert und man kann den packer per Combobox
auswählen. Allerdings hatte ich probleme BriefLZ stabil zu bekommen.
Es gab immer ein
Invalid Memory Access aus. Dann habe ich
die Memorys +1000 alloziert und dann gings kurrioserweise. Na egal,
so ist der test jetzt für alle packer gleich und fair. Nur auf Zip habe ich
verzichtet, weil es nicht die packsize zurückgibt und somit schwierig ist
mit einzubringen.
Die Ergebnisse waren doch recht überraschend:
testfile = hexen.wad / 20083672 bytes.
PackTest:
JCalG1 = 10688740 bytes in 13875 millisec.
PureCrunch = 14063545 bytes in 6813 millisec.
BriefLZ = 13336249 bytes in 10281 millisec.
UnpackTest:
JCalG1 = 547 millisec.
PureCrunch = 4074 millisec.
BriefLZ = 516 millisec.
Während PureCrunch beim packen noch am schnellsten war, hinkt es
beim entpacken noch hinterher. Auffällig ist auch das die ergebnisse
zwichen BriefLZ + PureCrunch nur sehr gering sind. Geringer als
wenn man bei BriefLZ einen grösseren Buffer benutzt. Während dessen
ist es bei PureCrunch adersherum. (kleinere buffer = effizienter und grosse = schlechter)
Fazit:
Der speed beim packen ist mehr als ok bei PureCrunch. Was ich noch
verbessern müsste, das wäre dann wohl den DeCruncher zu optimieren.
Ausserdem werde ich mal versuchen, (Wie du ja schon selbst vorgeschlagen hattest)
die BufferSize des Crunchers nicht mehr zu beschränken.
Und zum schluss noch der (Benchmark) TestCode.
Code: Alles auswählen
; PureCrunch, BriefLZ & JCalG1 Benchmark (Beispiel) Code für PureBasic v4.10
; Init variables & Memory
#JCalG1=0
#PureCrunch=1
#BriefLZ=2
BlockSize=6000 : Level=9
Buffer1=AllocateMemory(BlockSize+1000)
Buffer2=AllocateMemory(BlockSize+1000)
; Init GUI
OpenWindow(0, 450, 200, 403, 193, "Packer Benchmark", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
StringGadget(0, 113, 24, 244, 20, "")
StringGadget(1, 113, 48, 245, 20, "")
ProgressBarGadget(2, 20, 115, 365, 20, 0, 100, #PB_ProgressBar_Smooth)
TextGadget(3, 20, 90, 365, 20, "De/Compress Process", #PB_Text_Center|#PB_Text_Border)
TextGadget(4, 8, 26, 90, 20, "Source File", #PB_Text_Right)
TextGadget(5, 8, 50, 90, 20, "Destination File", #PB_Text_Right)
ButtonGadget(6, 362, 24, 25, 20, "...")
ButtonGadget(7, 362, 48, 25, 20, "...")
ButtonGadget(8, 228, 153, 79, 25, "Packen")
ButtonGadget(9, 310, 153, 79, 25, "Entpacken")
ComboBoxGadget(10,60,155,120,200)
TextGadget(11,5,158,45,23,"Packer",#PB_Text_Right)
AddGadgetItem(10,-1,"JCalG1")
AddGadgetItem(10,-1,"PureCrunch")
AddGadgetItem(10,-1,"BriefLZ")
SetGadgetState(10,0)
; Wait for Events
Repeat
Gadget.l=0
Event=WaitWindowEvent()
If Event=#PB_Event_Gadget
Gadget.l=EventGadget()
EndIf
; File(s) selection
If Gadget=6
File$=OpenFileRequester("Please choose a file","","",0)
If File$<>""
SetGadgetText(0,File$)
EndIf
EndIf
If Gadget=7
File$=SaveFileRequester("Please choose a file","","",0)
If File$<>""
SetGadgetText(1,File$)
EndIf
EndIf
; Start Crunch
If Gadget=8
PackerType = GetGadgetState(10)
Source$=GetGadgetText(0)
Dest$=GetGadgetText(1)
Size.l=FileSize(Source$)
Blocks.l=Size/BlockSize : Rest.l=Size-(Blocks*BlockSize)
SetGadgetAttribute(2,#PB_ProgressBar_Maximum,Blocks)
If ReadFile(0,Source$)
If CreateFile(1,Dest$)
WriteLong(1,Blocks)
WriteLong(1,Rest)
If Blocks>0
StartTime=ElapsedMilliseconds()
For i=1 To Blocks
SetGadgetState(2,i)
While WindowEvent():Wend
ReadData(0,Buffer1,BlockSize)
If PackerType=#JCalG1
Bytes=PackMemory(Buffer1,Buffer2,BlockSize,Level)
ElseIf PackerType=#PureCrunch
Bytes=PC_CrunchMemory(Buffer1,Buffer2,BlockSize,Level)
ElseIf PackerType=#BriefLZ
Bytes=BriefLZPack(Buffer1,Buffer2,BlockSize,0)
EndIf
WriteLong(1,Bytes)
If Bytes>0
WriteData(1,Buffer2,Bytes)
Else
WriteData(1,Buffer1,BlockSize)
EndIf
Next
ElapsedTime=ElapsedMilliseconds()-StartTime
EndIf
If Rest>0
ReadData(0,Buffer1,Rest)
If PackerType=#JCalG1
Bytes=PackMemory(Buffer1,Buffer2,Rest,Level)
ElseIf PackerType=#PureCrunch
Bytes=PC_CrunchMemory(Buffer1,Buffer2,Rest,Level)
ElseIf PackerType=#BriefLZ
Bytes=BriefLZPack(Buffer1,Buffer2,Rest,0)
EndIf
WriteLong(1,Bytes)
If Bytes>0
WriteData(1,Buffer2,Bytes)
Else
WriteData(1,Buffer1,Rest)
EndIf
EndIf
CloseFile(1)
len=FileSize(Dest$)
MessageRequester("Info", "Gepackte Grösse = "+Str(len)+" Bytes"+Chr(10)+"Benötigte Zeit = "+Str(ElapsedTime)+" millisec.", #MB_OK|#MB_ICONINFORMATION)
SetGadgetState(2,0)
EndIf
CloseFile(0)
EndIf
EndIf
; Start DeCrunch
If Gadget=9
PackerType = GetGadgetState(10)
Source$=GetGadgetText(0)
Dest$=GetGadgetText(1)
If ReadFile(0,Source$)
If CreateFile(1,Dest$)
Blocks=ReadLong(0)
Rest=ReadLong(0)
SetGadgetAttribute(2,#PB_ProgressBar_Maximum,Blocks)
If Blocks>0
StartTime=ElapsedMilliseconds()
For i=1 To Blocks
SetGadgetState(2,i)
While WindowEvent():Wend
Bytes=ReadLong(0)
If Bytes>0
ReadData(0,Buffer1,Bytes)
If PackerType=#JCalG1
UnPackLen.l=UnpackMemory(Buffer1,Buffer2)
ElseIf PackerType=#PureCrunch
UnPackLen.l=PC_DeCrunchMemory(Buffer1,Buffer2,Bytes)
ElseIf PackerType=#BriefLZ
UnPackLen.l=BriefLZDePack(Buffer1,Buffer2,BlockSize,0)
EndIf
Else
ReadData(0,Buffer2,BlockSize)
UnPackLen.l=BlockSize
EndIf
WriteData(1,Buffer2,UnPackLen)
Next
ElapsedTime=ElapsedMilliseconds()-StartTime
EndIf
If Rest>0
Bytes=ReadLong(0)
If Bytes>0
ReadData(0,Buffer1,Bytes)
If PackerType=#JCalG1
UnPackLen.l=UnpackMemory(Buffer1,Buffer2)
ElseIf PackerType=#PureCrunch
UnPackLen.l=PC_DeCrunchMemory(Buffer1,Buffer2,Bytes)
ElseIf PackerType=#BriefLZ
UnPackLen.l=BriefLZDePack(Buffer1,Buffer2,Rest,0)
EndIf
Else
ReadData(0,Buffer2,Rest)
UnPackLen.l=Rest
EndIf
WriteData(1,Buffer2,UnPackLen)
EndIf
CloseFile(1)
len=FileSize(Dest$)
MessageRequester("Info", "Ungepackte Grösse = "+Str(len)+" Bytes"+Chr(10)+"Benötigte Zeit = "+Str(ElapsedTime)+" millisec.", #MB_OK|#MB_ICONINFORMATION)
SetGadgetState(2,0)
EndIf
CloseFile(0)
EndIf
EndIf
Until Event=#PB_Event_CloseWindow
FreeMemory(Buffer1)
FreeMemory(Buffer2)
CloseWindow(0)