by JmGarcia » Fri Mar 16, 2012 11:29 am
Probaré vuestras últimas propuestas.
He hecho una pequeña prueba con la creación de un array de hasta 1.000 elementos, generando aleatoriamente la key (cMatricula), y efectuando 1.000.000 de accesos.
El resultado es sorprendente:
Con arrays convencionales tarda 266 seg.
con arrays HASH tarda 4 seg.Os dejo el código:
- Code: Select all Expand view
********************************************************************************
#include "FiveWin.ch"
function main()
public aCoches:={},oCoche
public hCoches:={=>} // Crea array/tabla HASH vacia
public nIndice,cMatricula,nSegundos
*---
nSegundos:=seconds()
for nIndice=1 to 1000000 // Un millon de veces
Buscar1(alltrim(str(int(HB_Random(1,1000))))) // Números aleatorios de 1 a 1000
next nIndice
nSegundos:=seconds()-nSegundos
? nSegundos // 266 seg. con arrays/tablas convencionales
aCoches:={}
*---
nSegundos:=seconds()
for nIndice=1 to 1000000 // Un millon de veces
Buscar2(alltrim(str(int(HB_Random(1,1000))))) // Números aleatorios de 1 a 1000
next nIndice
nSegundos:=seconds()-nSegundos
? nSegundos // 4 seg. con arrays/tablas HASH
hCoches:={=>}
*---
return nil
********************************************************************************
function Buscar1(cMatricula) // Con arrays/tablas convencionales
local nIndice:=aScan(aCoches,{|oCoche|oCoche:cMatricula==cMatricula})
if nIndice>0 // Existe
oCoche:=aCoches[nIndice]
oCoche:nAccesos:=oCoche:nAccesos+1
else // No existe
oCoche:=TCoche():New(cMatricula)
cMatricula:=oCoche:cMatricula
aadd(aCoches,oCoche)
endif
*-------------------------------------------------------------------------------
function Buscar2(cMatricula) // Con arrays/tablas HASH
if cMatricula IN hCoches // Existe
hCoches[cMatricula]:nAccesos:=hCoches[cMatricula]:nAccesos+1
else // No existe
hCoches[cMatricula]:=TCoche():New(cMatricula)
cMatricula:=hCoches[cMatricula]:cMatricula
endif
return nil
********************************************************************************
CLASS TCoche
DATA nAccesos AS NUMERIC INIT 0
DATA cMatricula,nPeso,cColor
CLASSDATA lRegistered AS LOGICAL
METHOD New(cMatricula) CONSTRUCTOR
METHOD End()
ENDCLASS
METHOD New(cMatricula) CLASS TCoche
DEFAULT cMatricula:="XX9999"
::nAccesos:=1
::cMatricula:=cMatricula
::nPeso:=1000
::cColor:="rojo"
return Self
METHOD End() CLASS TCoche
::nAccesos:=nil
::cMatricula:=nil
::nPeso:=nil
::cColor:=nil
return .T.
********************************************************************************
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013