07-28-2003, 06:14 PM
I did a benchmark between mine and antonis, i think he'll agree that they're very fair. Here they are.
And Antonis
After running each 8 times during the exact same conditions my best was 6301538 and Antonis was 2925714.
Code:
defint a-z
const KEYMIN& = 0&
const KEYMAX& = 99999&
const VALIDKEY = -1
declare sub loadKeyTable ( filename as string )
declare function checkKey% ( keyToCheck as long )
'$dynamic
dim shared keyTable( KEYMAX \ 16384&, 16383 ) as integer
'$static
''
'' Entry point
''
dim result as integer
dim keyToCheck as long
dim indxa as integer, indxb as integer
dim tmrIni as single, tmrEnd as single
''
'' This is not part of the main program
'' it's just setup.
''
loadKeyTable "valid.txt"
keyToCheck = 13
tmrIni = timer
for i = 0 to 31999
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
indxa = keyToCheck \ 16384&
indxb = keyToCheck and 16383&
result = keyTable( indxa, indxb )
next i
tmrEnd = timer
print "Blitz code does" + str$(clng( 32000#*10# / (tmrEnd-tmrIni) )) + " searches per second"
'' :::::::::
'' name: loadKeyTable
'' desc: Loads a bunch of valid keys
'' note: This is to be run BEFORE starting to time
''
'' :::::::::
defint a-z
sub loadKeyTable ( filename as string ) static
dim currKey as long
dim keysRead as long
dim keysInFile as long
dim i as integer, j as integer
dim indxa as integer, indxb as integer
open filename for input as #1
''
'' Clear table and load keys
''
for i = 0 to KEYMAX \ 16384&
for j = 0 to 16383
keyTable( i, j ) = 0
next j
next i
while ( not eof( 1 ) )
input #1, currKey
if ( (currKey < KEYMIN) or (currKey > KEYMAX) ) then
print "Error: Invalid key in file..."
end
end if
''
'' Put key in table
''
indxa = currKey \ 16384&
indxb = currKey and 16383&
keyTable( indxa, indxb ) = VALIDKEY
wend
close #1
end sub
And Antonis
Code:
DECLARE FUNCTION funFirstPrime% (threshold%)
DEFINT A-Z
CONST empty = -1&
CONST QBOFFSET = 16636
'-----------------------------setup------------------------------------
filename$ = "valid.txt"
OPEN filename$ FOR INPUT AS #1
codecnt = 0
WHILE NOT EOF(1)
codecnt = codecnt + 1
INPUT #1, CODE$
WEND
TABLESIZE = funFirstPrime(codecnt)
REDIM SHARED CODES(-QBOFFSET TO TABLESIZE - QBOFFSET) AS LONG
FOR I = LBOUND(CODES) TO UBOUND(CODES)
CODES(I) = empty
NEXT
SEEK 1, 1
WHILE NOT EOF(1)
INPUT #1, CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> empty
IF CODES(KEYINDEX - QBOFFSET) = CODE& THEN PRINT "Repeated code in input": END
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
CODES(KEYINDEX - QBOFFSET) = CODE&
WEND
CLOSE
'--------------------------main loop-------------------------------------
dim result as integer
dim tmrIni as single, tmrEnd as single
CODE& = 13
tmrIni = timer
for i = 0 to 31999
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
KEYINDEX = (CODE& MOD TABLESIZE)
WHILE CODES(KEYINDEX - QBOFFSET) <> CODE& AND CODES(KEYINDEX - QBOFFSET) <> empty
IF KEYINDEX = TABLESIZE THEN
KEYINDEX = 0
ELSE
KEYINDEX = KEYINDEX + 1
END IF
WEND
result = CODES(KEYINDEX - QBOFFSET) = CODE&
next i
tmrEnd = timer
print "Antonis code does" + str$(clng( 32000#*10# / (tmrEnd-tmrIni) )) + " searches per second"
END
FUNCTION funFirstPrime (threshold)
tp30 = INT((threshold * 1.3))
IF tp30 / 2 = tp30 \ 2 THEN
tp30 = tp30 + 1
END IF
c = tp30 - 2
IF c < 1 THEN
c = 1
END IF
t2& = threshold * 2&
DO
c = c + 2
FOR z = 3 TO SQR(c)
ind = -1
IF c / z = c \ z THEN
ind = FALSE
EXIT FOR
END IF
NEXT z
IF ind THEN
IF (c - 3) / 4 = INT((c - 3) / 4) OR c > t2& THEN
funFirstPrime = c
EXIT DO
END IF
END IF
LOOP
END FUNCTION
After running each 8 times during the exact same conditions my best was 6301538 and Antonis was 2925714.
oship me and i will give you lots of guurrls and beeea