|  | @@ -0,0 +1,70 @@
 | 
	
		
			
				|  |  | +Object subclass: #Benchfib
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Benchfib'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Benchfib class methodsFor: 'not yet classified'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +main
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	| result |
 | 
	
		
			
				|  |  | +	result := 0 tinyBenchmarks.
 | 
	
		
			
				|  |  | +	{'console.log(''0 tinyBenchmarks => '' + result);'}
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Number methodsFor: '*Benchfib'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +benchFib
 | 
	
		
			
				|  |  | +	"Handy send-heavy benchmark"
 | 
	
		
			
				|  |  | +	"(result // seconds to run) = approx calls per second"
 | 
	
		
			
				|  |  | +	" | r t |
 | 
	
		
			
				|  |  | +	  t := Time millisecondsToRun: [r := 26 benchFib].
 | 
	
		
			
				|  |  | +	  (r * 1000) // t"
 | 
	
		
			
				|  |  | +	"138000 on a Mac 8100/100"
 | 
	
		
			
				|  |  | +	^ self < 2
 | 
	
		
			
				|  |  | +		ifTrue: [1] 
 | 
	
		
			
				|  |  | +		ifFalse: [(self-1) benchFib + (self-2) benchFib + 1]
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +benchmark  "Handy bytecode-heavy benchmark"
 | 
	
		
			
				|  |  | +	"(500000 // time to run) = approx bytecodes per second"
 | 
	
		
			
				|  |  | +	"5000000 // (Time millisecondsToRun: [10 benchmark]) * 1000"
 | 
	
		
			
				|  |  | +	"3059000 on a Mac 8100/100"
 | 
	
		
			
				|  |  | +    | size flags prime k count |
 | 
	
		
			
				|  |  | +    size := 8190.
 | 
	
		
			
				|  |  | +    1 to: self do:
 | 
	
		
			
				|  |  | +        [:iter |
 | 
	
		
			
				|  |  | +        count := 0.
 | 
	
		
			
				|  |  | +        flags := Array new.
 | 
	
		
			
				|  |  | +        size timesRepeat: [ flags add: true].
 | 
	
		
			
				|  |  | +        1 to: size do:
 | 
	
		
			
				|  |  | +            [:i | (flags at: i) ifTrue:
 | 
	
		
			
				|  |  | +                [prime := i+1.
 | 
	
		
			
				|  |  | +                k := i + prime.
 | 
	
		
			
				|  |  | +                [k <= size] whileTrue:
 | 
	
		
			
				|  |  | +                    [flags at: k put: false.
 | 
	
		
			
				|  |  | +                    k := k + prime].
 | 
	
		
			
				|  |  | +                count := count + 1]]].
 | 
	
		
			
				|  |  | +    ^ count
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +tinyBenchmarks
 | 
	
		
			
				|  |  | +	"Report the results of running the two tiny Squeak benchmarks.
 | 
	
		
			
				|  |  | +	ar 9/10/1999: Adjusted to run at least 1 sec to get more stable results"
 | 
	
		
			
				|  |  | +	"0 tinyBenchmarks"
 | 
	
		
			
				|  |  | +	"On a 292 MHz G3 Mac: 22727272 bytecodes/sec; 984169 sends/sec"
 | 
	
		
			
				|  |  | +	"On a 400 MHz PII/Win98:  18028169 bytecodes/sec; 1081272 sends/sec"
 | 
	
		
			
				|  |  | +	| t1 t2 r n1 n2 |
 | 
	
		
			
				|  |  | +	n1 := 1.
 | 
	
		
			
				|  |  | +	[t1 := Date millisecondsToRun: [n1 benchmark].
 | 
	
		
			
				|  |  | +	t1 < 1000] whileTrue:[n1 := n1 * 2]. "Note: #benchmark's runtime is about O(n)"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	n2 := 28.
 | 
	
		
			
				|  |  | +	[t2 := Date millisecondsToRun: [r := n2 benchFib].
 | 
	
		
			
				|  |  | +	t2 < 1000] whileTrue:[n2 := n2 + 1]. 
 | 
	
		
			
				|  |  | +	"Note: #benchFib's runtime is about O(k^n),
 | 
	
		
			
				|  |  | +		where k is the golden number = (1 + 5 sqrt) / 2 = 1.618...."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	^ ((n1 * 500000 * 1000) / t1) printString, ' bytecodes/sec; ',
 | 
	
		
			
				|  |  | +	  ((r * 1000) / t2) printString, ' sends/sec'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 |