75 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2009 Slava Pestov.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: accessors assocs combinators grouping kernel locals math
 | 
						|
math.parser math.ranges memoize sequences ;
 | 
						|
IN: benchmark.hashtables
 | 
						|
 | 
						|
MEMO: strings ( -- str )
 | 
						|
    0 100 [a,b) 1 [ + ] accumulate* [ number>string ] map ;
 | 
						|
 | 
						|
:: add-delete-mix ( hash keys -- )
 | 
						|
    keys [| k |
 | 
						|
        0 k hash set-at
 | 
						|
        k hash delete-at
 | 
						|
    ] each
 | 
						|
 | 
						|
    keys [
 | 
						|
        0 swap hash set-at
 | 
						|
    ] each
 | 
						|
 | 
						|
    keys [
 | 
						|
        hash delete-at
 | 
						|
    ] each ;
 | 
						|
 | 
						|
:: store-lookup-mix ( hash keys -- )
 | 
						|
    keys [
 | 
						|
        0 swap hash set-at
 | 
						|
    ] each
 | 
						|
 | 
						|
    keys [
 | 
						|
        hash at
 | 
						|
    ] map drop
 | 
						|
 | 
						|
    keys [
 | 
						|
        hash [ 1 + ] assocs:change-at
 | 
						|
    ] each ;
 | 
						|
 | 
						|
: string-mix ( hash -- )
 | 
						|
    strings
 | 
						|
    [ add-delete-mix ]
 | 
						|
    [ store-lookup-mix ]
 | 
						|
    2bi ;
 | 
						|
 | 
						|
TUPLE: collision value ;
 | 
						|
 | 
						|
M: collision hashcode* value>> hashcode* 15 bitand ;
 | 
						|
 | 
						|
: collision-mix ( hash -- )
 | 
						|
    strings 30 head [ collision boa ] map
 | 
						|
    [ add-delete-mix ]
 | 
						|
    [ store-lookup-mix ]
 | 
						|
    2bi ;
 | 
						|
 | 
						|
: small-mix ( hash -- )
 | 
						|
    strings 10 group [
 | 
						|
        [ add-delete-mix ]
 | 
						|
        [ store-lookup-mix ]
 | 
						|
        2bi
 | 
						|
    ] with each ;
 | 
						|
 | 
						|
: hashtables-benchmark ( -- )
 | 
						|
    H{ } clone
 | 
						|
    10000 [
 | 
						|
        dup {
 | 
						|
            [ small-mix ]
 | 
						|
            [ clear-assoc ]
 | 
						|
            [ string-mix ]
 | 
						|
            [ clear-assoc ]
 | 
						|
            [ collision-mix ]
 | 
						|
            [ clear-assoc ]
 | 
						|
        } cleave
 | 
						|
    ] times
 | 
						|
    drop ;
 | 
						|
 | 
						|
MAIN: hashtables-benchmark
 |