FileTest Comparisons

Jimmie Houchin jhouchin at texoma.net
Tue Feb 18 22:37:53 UTC 2003


Hello all wise Squeakers. :)
Okay those with experience.

Please feel free to critique my code.
I am learning. Most of my code may be very naive.
If I am breaking rules or best practices, please, please, feel free to 
speak up and educate me and anyone else who wishes to be enlightened.

Thanks.

Now on to my reply...   (see below)

Andreas Raab wrote:
> Jimmie,
> 
> I'm very interested in these results, in particular the difference between
> the "regular" and async files on Windows. That seems *very* surprising to
> me... do you have any chance to measure where exactly the difference comes
> from (e.g., is it in opening, writing, or closing)?! The reason I'm
> wondering is that as far as the code is concerned there should be no
> difference whatsoever between the two. If there is, then I'm making some
> *rather* big mistake somewhere deep down below.
> 
> Cheers,
>   - Andreas

Hello Andreas,

Below is my new code to test problem spots (timings).
First here are the results from my code.


FileStream tests ....................................
timeToRun = 17415
timeName =   1489
timeNPA   =     80
timeFlush =  15734
timeClose  =    103
totalTimes =  17406

timeToRun = 17388
timeName =   1537
timeNPA   =     92
timeFlush =  15672
timeClose  =     74
totalTimes =  17375

timeToRun = 15937
timeName =   1492
timeNPA   =     82
timeFlush =  14256
timeClose  =     95
totalTimes =  15925

AsyncFile tests ......................................

timeToRun = 996
timeAFNew = 0
timeOpen   = 683
timeWrite   = 131
timeClose   = 162
totalTimes  = 976
With 105 empty files.


timeToRun = 1063
timeAFNew = 1
timeOpen   = 724
timeWrite   = 147
timeClose   = 175
totalTimes  = 1047
With 142 empty files.


timeToRun = 1027
timeAFNew = 2
timeOpen   = 711
timeWrite   = 126
timeClose   = 166
totalTimes  = 1005
With 139 empty files.

The AsyncFile code consistently did not writeBuffer 10-15% of the time.
I don't know if I am doing something wrong or what.

It seems as if #flush is the big spender.

I hope this helps.

Jimmie Houchin




New Testing Code: ........................................
| string filedir timeName timeNPA timeFlush timeClose |

string := 'Hello World!'.
filedir := FileDirectory default fullName, '\testfiles\'.

timeName := 0.
timeNPA := 0.
timeFlush := 0.
timeClose := 0.

Transcript show: 'timeToRun = ', [1 to: 1000 do: [:index |
	t1 := [fname := FileStream newFileNamed: filedir, index asString] 
timeToRun.
	t2 := [fname nextPutAll: string] timeToRun.
	t3 := [fname flush] timeToRun.
	t4 := [fname close] timeToRun.
	timeName := timeName + t1.
	timeNPA := timeNPA + t2.
	timeFlush := timeFlush + t3.
	timeClose := timeClose + t4.]]  timeToRun asString; cr.

Transcript show: 'timeName = ', timeName asString; cr.
Transcript show: 'timeNPA   = ', timeNPA asString; cr.
Transcript show: 'timeFlush = ', timeFlush asString; cr.
Transcript show: 'timeClose  = ', timeClose asString; cr.
Transcript show: 'totalTimes = ', (timeName + timeNPA + timeFlush + 
timeClose) asString; cr.


| string2 filedir2 timeAFNew timeOpen timeWrite timeClose |

string2 := 'Hello World!'.
filedir2 := FileDirectory default fullName, '\testfiles\'.
timeAFNew := 0.
timeOpen := 0.
timeWrite := 0.
timeClose := 0.

Transcript show: 'timeToRun = ', [1 to: 1000 do: [:index |
	t1 := [fname := AsyncFile new] timeToRun.
	t2 := [fname open: filedir2, index asString forWrite: true] timeToRun.
	t3 := [fname writeBuffer: string2 atFilePosition: 0 onCompletionDo:[]] 
timeToRun.
	t4 := [fname close] timeToRun.
	timeAFNew := timeAFNew + t1.
	timeOpen := timeOpen + t2.
	timeWrite := timeWrite + t3.
	timeClose := timeClose + t4.]] timeToRun asString; cr.

Transcript show: 'timeAFNew = ', timeAFNew asString; cr.
Transcript show: 'timeOpen   = ', timeOpen asString; cr.
Transcript show: 'timeWrite   = ', timeWrite asString; cr.
Transcript show: 'timeClose   = ', timeClose asString; cr.
Transcript show: 'totalTimes  = ', (timeAFNew + timeOpen + timeWrite + 
timeClose) asString; cr.





>>-----Original Message-----
>>From: squeak-dev-bounces at lists.squeakfoundation.org 
>>[mailto:squeak-dev-bounces at lists.squeakfoundation.org] On 
>>Behalf Of Jimmie Houchin
>>Sent: Tuesday, February 18, 2003 9:07 PM
>>To: The general-purpose Squeak developers list
>>Subject: FileTest Comparisons
>>
>>
>>Before writing for help regarding Socket serving I wrote some 
>>tests to 
>>check Squeak performance when simply streaming to files 
>>instead of sockets.
>>
>>Then I compared with similar Python code.
>>
>>Below are the results and code.
>>
>>Both Squeak and Python are slower on my WinXP machine.
>>The WinXP machine is technically almost 3X as fast as my 
>>Debian machine.
>>I wish I had Linux installed on that machine to test. Maybe soon.
>>
>>The Squeak code on the Windows machine is very slow. (with FileStream)
>>I attempted AsyncFile to try to speed things up and it did 
>>quite a bit 
>>on Windows and some on Linux. But it failed to write out its 
>>buffer to 
>>all (missed about 20%) the 1000 files. It created all the files, just 
>>didn't fill them.
>>
>>Is the AsyncFile code going to be about the fastest way to do 
>>something 
>>like this? I don't even know if I am quite using the 
>>AsyncFile properly.
>>
>>Suggestions, reasons, comments welcome.
>>
>>Jimmie Houchin
>>
>>
>>Windows XP Home  (Athlon XP 2000) results:
>>Squeak Results with FileStream: (ms) 17208  17441  17197
>>Squeak Results with AsyncFile: (ms)   1018    966   1050
>>Python Results: (seconds)             .718   .781   .922
>>
>>Debian Linux  (700mhz Athlon) results:
>>Squeak Results with FileStream:  749   579   679
>>Squeak Results with AsyncFile:   550   244   431
>>Python Results: (seconds)       .445  .432
>>
>>
>>Squeak Code
>>| string filedir |
>>string := 'Hello World!'.
>>filedir := FileDirectory default fullName, '\testfiles\'.
>>
>>Transcript show: [1 to: 1000 do: [:index |
>>	fname := FileStream newFileNamed: filedir, index asString.
>>	fname nextPutAll: string.
>>	fname flush.
>>	fname close.]] timeToRun.
>>
>>| string2 filedir2 |
>>string2 := 'Hello World!'.
>>filedir2 := FileDirectory default fullName, '\testfiles\'.
>>
>>Transcript show: [1 to: 1000 do: [:index |
>>	fname := AsyncFile new.
>>	fname open: filedir2, index asString forWrite: true.
>>	fname writeBuffer: string2 atFilePosition: 0 onCompletionDo:[].
>>	fname close.]] timeToRun.
>>
>>
>>
>>Python Code:
>>fileTest.py
>>import os, time
>>
>>fdir = os.getcwd() + '/testfiles/'
>>fstring = 'Hello World!'
>>
>>
>>def test(rnumber):
>>     t1 = time.time()
>>     r = range(rnumber)
>>     for x in r:
>>         fname = open(fdir+`x`,'w')
>>         fname.write(fstring)
>>         fname.flush()
>>         fname.close()
>>     t2 = time.time()
>>     print t2 - t1




More information about the Squeak-dev mailing list