Você está na página 1de 10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

TudoemADVPl
Compartilhandoexperinciasdeanlise,
programaoedesenvolvimento.

PerformanceeescalabilidadeHashMap
emAdvPL
16/12/201416/12/2014
Performance

Siga0984

ADVPL,Escalabilidade,Exemplos,

OqueumHashMap(ouHashTable)?
Emcomputao,umatabeladehash(HashTable)oumapadehash(HashMap)uma
estruturadedadosqueimplementaumarrayassociativo,tambmconhecidoporchavevalor,
ondeumdeterminadovaloracessadoporumadeterminadachave.Emmuitassituaes,esta
estruturamuitomaiseficientedoqueutilizarumarvoredebusca,arrayordenado,ou
qualqueroutraestruturadedadosoumecanismodepesquisa.
ApartirdoTOTVSApplicationServer,build7.00.131227A,foramdisponibilizadasumgrupo
defunesparaacriaoemanutenodeumHashMap,inclusiveacriaodeumHashMap
apartirdosdadoscontidosemumarraymultidimensionalemAdvPL.

Vantagens
AvantagemdautilizaodoHashMapemrelaoaoutrasestruturasavelocidadede
localizaodeumvalorapartirdachavefornecida.Estadiferenadedesempenhomais
perceptvelquandotemosumnmeromaiordeentradasouelementosnoArray.

Desvantagens

1/10
Porm,amanutenodeumHashMap(acrescentarouremoverelementos)podeterumcusto

https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

Porm,amanutenodeumHashMap(acrescentarouremoverelementos)podeterumcusto
maior,inclusivedependendodaestruturainternadaimplementaodoalgoritmodehash,
estecustodemanutenopodeaumentarproporcionalmentedeacordocomaquantidadede
elementosnomapa.

Melhorcenrio
Logo,omelhorcenrioparausodeumHashMappartedautilizaoemumArraydedados
namemria,ondeduranteoprocessamentohaverpoucaounenhumamanutenoneste
mapa(acrescentarouremoverelementos),eaquantidadedebuscasrealizadasnestemapaseja
apartesignificativadoprocessamento.
Programadeexemplo
ParailustrarumcasosimplesdeusodoHashMapemAdvpl,vamosaumprogramade
exemplo,ondesercriadoumarraycomrelativamentepoucoselementos(17),ondea
primeiracolunaserachavedebusca,evamosrealizar50milbuscasparacadaumadas17
chaves,mais50milbuscasporumachavenoexistente.
Naprimeirapartedoprograma,asbuscassobreoArrayserofeitascomASCAN(),ena
segundapartedoprograma,vamoscriarumObjetodeHashMapapartirdoArray,usandoa
funoaToHM(),edepoisrealizarasmesmasbuscasusandooobjetodeHashMap.
Aotodo,cadatestevairealizar900000(novecentasmil)buscas,ondeserocontabilizadosos
temposdas50milbuscasparacadavalorporcadamtodo,eotempototaldetodasasbuscas
pormtodoutilizado.
SegueoprogramaAdvplabaixo.Apscompilado,elepodeserexecutadodiretamenteapartir
doSmartClient,atravsdafunoU_TSTHASH

Fonte
#includeprotheus.ch
USERFunctionTstHash()
LocalaDados:={}
LocalnI,nJ
LocalnTimer,nTotal
LocalcBusca
LocalnPos,xValue
LocaloHash
//Criaumarraydeduascolunas,com17elementos

https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

2/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

aadd(aDados,{"BC","Branco"})
aadd(aDados,{"AZ","Azul"})
aadd(aDados,{"VM","Vermelho"})
aadd(aDados,{"VD","Verde"})
aadd(aDados,{"RX","Roxo"})
aadd(aDados,{"AM","Amarelo"})
aadd(aDados,{"MA","Marrom"})
aadd(aDados,{"AM","AzulMarinho"})
aadd(aDados,{"AC","AzulCu"})
aadd(aDados,{"AQ","AmareloQueimado"})
aadd(aDados,{"AT","AzulTurquesa"})
aadd(aDados,{"SA","Salmo"})
aadd(aDados,{"VO","VerdeOliva"})
aadd(aDados,{"VI","Violeta"})
aadd(aDados,{"GR","Cinza"})
aadd(aDados,{"PB","Chumbo"})
aadd(aDados,{"PT","Preto"})
//FazumtestededesempenhobuscandopeloselementosusandoASCAN()
//Faz50milbuscasparacadaumdoselementoscadastrados
//Oultimoloopbuscaporumelementoquenaoexiste
nTotal:=seconds()
FornI:=1tolen(aDados)+1
IfnI>len(aDados)
//Buscaporumelementoquenaoexiste
cBusca:="NE"
Else
//Buscaporumelementoqueexistenalista
cBusca:=aDados[nI][1]
Endif
nTimer:=seconds()
FornJ:=1to50000
//Realiza50milbuscas
nPos:=ascan(aDados,{|x|x[1]==cBusca})
Next
nTimer:=seconds()nTimer
conout("Buscapor["+cBusca+"]demorou"+cValToChar(nTimer)+"s.")
Next
nTotal:=seconds()nTotal
conout("TempoTotal(ASCAN)="+cValToChar(nTotal)+"s.")
conout("")
//AgorausandooHASH
nTotal:=seconds()
//CriaoObjetodeHASHapartirdoArray
oHash:=aToHM(aDados)
https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

3/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

FornI:=1tolen(aDados)+1
IfnI>len(aDados)
//Buscaporumelementoquenaoexiste
cBusca:="NE"
Else
//Buscaporumelementoqueexistenalista
cBusca:=aDados[nI][1]
Endif
nTimer:=seconds()
FornJ:=1to50000
//Realiza50milbuscas
lFound:=HMGet(oHash,cBusca,@xValue)
Next
nTimer:=seconds()nTimer
conout("Buscapor["+cBusca+"]demorou"+cValToChar(nTimer)+"s.")
Next
nTotal:=seconds()nTotal
conout("TempoTotal(HASH)="+cValToChar(nTotal)+"s.")
Return

Resultadosobtidos
Paravisualizaroresultadodoprograma,verifiqueoLOGdeconsoledoApplicationServer.
Segueabaixoumexemplodologgerado:
Buscapor[BC]demorou0.359s.
Buscapor[AZ]demorou0.406s.
Buscapor[VM]demorou0.421s.
Buscapor[VD]demorou0.483s.
Buscapor[RX]demorou0.53s.
Buscapor[AM]demorou0.593s.
Buscapor[MA]demorou0.624s.
Buscapor[AM]demorou0.577s.
Buscapor[AC]demorou0.702s.
Buscapor[AQ]demorou0.78s.
Buscapor[AT]demorou0.796s.
Buscapor[SA]demorou0.826s.
Buscapor[VO]demorou0.874s.
Buscapor[VI]demorou0.92s.
Buscapor[GR]demorou0.969s.
Buscapor[PB]demorou1.014s.
Buscapor[PT]demorou1.061s.
Buscapor[NE]demorou1.061s.
TempoTotal(ASCAN)=13.075s.

https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

4/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

Buscapor[BC]demorou0.094s.
Buscapor[AZ]demorou0.094s.
Buscapor[VM]demorou0.093s.
Buscapor[VD]demorou0.094s.
Buscapor[RX]demorou0.093s.
Buscapor[AM]demorou0.094s.
Buscapor[MA]demorou0.093s.
Buscapor[AM]demorou0.094s.
Buscapor[AC]demorou0.093s.
Buscapor[AQ]demorou0.094s.
Buscapor[AT]demorou0.109s.
Buscapor[SA]demorou0.094s.
Buscapor[VO]demorou0.093s.
Buscapor[VI]demorou0.094s.
Buscapor[GR]demorou0.094s.
Buscapor[PB]demorou0.109s.
Buscapor[PT]demorou0.093s.
Buscapor[NE]demorou0.078s.
TempoTotal(HASH)=1.716s.
Reparemque,aobuscarcomASCAN(),comoabuscafeitasequencialmente,quantomais
elementosprecisamsercomparadosatquesejaencontradoondoarrayquesatisfaza
condio,maiorotempodebusca.Opiorcenrioabuscaporumelementoquenoexiste,
poisnestecasooASCAN()varreutodososelementosdoArrayparadeterminarqueovalor
noexiste.Nomelhorcenrio,50milbuscasdoprimeirovalordoarraydemoraram0,359
segundos,enopiorcenrio,quandoovalorbuscadoeraoltimovalordoarrayouquandoo
valornoexistianoarray,50milbuscasdemoraram1,061segundos.
Jcomousodoobjetodehash,criadoapartirdestemesmoarray,odesempenhodasbuscas
foiaproximadamente7,6vezesmaisrpido,ecadaumadasbuscas,noimportaseachavede
buscaestavanoincioounofinaldomapa,demoraramemmdia1/10desegundo.

Concluso
ComomencionadonotpicoMellhorCenrio,emumprocessamentoondeusamosum
Arrayemmemriacombaixaounenhumamanuteno,eumvolumemuitograndedebuscas,
oHashMapumaalternativaexcelenteemcustoxbenefcio.
Porm,lembresetambmdaLeideAmdahl:Oganhodedesempenhoquepodeserobtido
melhorandoumadeterminadapartedosistemalimitadopelafraodetempoqueessaparte
utilizadapelosistemaduranteasuaoperao.Isto,seoseucasodeusocriaarrays
pequenoseparapoucasconsultas,tomandoumtemponfimodeprocessamento,criarum
HashMapsvaitedartrabalhoderefatorarseucdigo,evocnoterumganhoperceptvel,
ouainda,nopiorcenrio,apresentarumapioranodesempenho.Nesteexemplofoiusadoum
arraymuitopequeno,logoforamnecessriasmuitasbuscasparamostraradiferenade
desempenho.Cadatestecompletofez900milbuscasnoArraye900milusandoHashMap.
5/10
AsfunesparalidarcomHashMapemAdvPLestodocumentadasnaTDN,apartirdolink

https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

AsfunesparalidarcomHashMapemAdvPLestodocumentadasnaTDN,apartirdolink
http://tdn.totvs.com/pages/viewpage.action?pageId=77300615
(http://tdn.totvs.com/pages/viewpage.action?pageId=77300615)

LetsShare
Esperoquevocstenhamgostadodalinhaderaciocnioecontedodisponibilizadosaquino
Blog.Noseacanheemcomentarseficoualgumadvidaousealgumapartedotextoficou
sempnemcabea.Sevocgostou,eachouestecontedotil,compartilhe,eseestelhefor
til,useo.NoprximopostsobreHashMap,ofontedeexemplovaiutilizartodasasfunes
demanuteno,eumndicedebuscacomposto.
Aessnciadoconhecimentoconsisteemapliclo,umavezpossudo.Confcio
Atoprximopost,pessoal

Referncias
Wikipediacontributors.Hashtable.Wikipedia,TheFreeEncyclopedia.December11,2014,
06:10UTC.Availableat:http://en.wikipedia.org/w/index.php?
title=Hash_table&oldid=637586906(http://en.wikipedia.org/w/index.php?
title=Hash_table&oldid=637586906).AccessedDecember17,2014.
Sobre estes anncios (https://wordpress.com/about-these-ads/)

12comentriossobrePerformance e
escalabilidade Hash Map emAdvPL
1. FabioFongarodisse:
17/12/2014s06:12
https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

6/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

17/12/2014s06:12
Existerevisodousodesterecursoparaasfunesfiscaisdegeraodenotafiscalque
quandousadascomoexecautosomuitolentas,poisvalidamlinhaalinha,campoacampo,
emcascatatodososelementosdanota(acadanovoelementovalidamtodososanteriores)?
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=7&_wpnonce=a1ff9f558e)
Curtidopor1pessoa
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=7#respond)
Siga0984disse:
17/12/2014s23:23
OlFbio,boanoite,
SobreaMSExecAuto()euconheoapenasopropsitodaimplementao,masnotenho
detalhesdecomoelafuncionapordentro,bemcomomeusconhecimentosnasregrasde
negciodoERPMicrosigatambmsobemsuperficiais.Nocaso,seinternamentea
validaodetodasaslinhasreexecutadaacadanovoiteminseridona
MSExexcAuto(),acreditoquetrocarumarrayconvencionalparausarumHashno
devemelhorarodesempenhodesteprocesso.Oquemelhorariaserianorevalidar
todosositensacadanovoitem,pormumavezconstatadoestecomportamento,deve
serverificadosenoexistealgumaregradenegcioqueexijaarevalidaodetodosos
itens,comoporexemploumdescontoporitemquepodeseraplicadoatodosositensda
notacasoelaultrapasseumvalor.Umaregradenegciocomoessajustificariaa
necessidadederevalidartodososelementos.
Esperoterajudado
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidade
hashmapemadvpl/?like_comment=10&_wpnonce=de176a38e0)
Curtir
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=10#respond)
2. SergioMartinezdisse:
17/12/2014s06:23
Excelenteartigoeumexemplomuitobemexplicadoeclaro.
Parabns
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=8&_wpnonce=49ebb68003)
Curtidopor1pessoa
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=8#respond)
Siga0984disse:
17/12/2014s23:12
OlSrgio,obrigado
https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

7/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidade
hashmapemadvpl/?like_comment=9&_wpnonce=9909672f94)
Curtir
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=9#respond)
3. FbioMarginidisse:
18/12/2014s07:51
MuitolegalseublogJlio!Estousempreacompanhandoseusartigossempreum
aprendizado.Parabns!
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=11&_wpnonce=87a1792280)
Curtir
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=11#respond)
Siga0984disse:
19/12/2014s20:49
OlFbio,
Gratopelofeedbackeporsuaaudincia
Abraos!!!
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidade
hashmapemadvpl/?like_comment=13&_wpnonce=b0a21989c7)
Curtir
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=13#respond)
4. AlvaroCamilloNetodisse:
18/12/2014s11:04
Muitolegalesseartigo!
Aapresentaodosnovosrecursosdessejeitomaisdescontradoecomexemplosest
excelente.
Jpasseioartigoparatodaaminhaequipe.
Att
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=12&_wpnonce=e26368af2e)
Curtidopor1pessoa
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=12#respond)
Siga0984disse:
22/12/2014s01:33
Ollvaro,
https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

8/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

Quebomquegostou!Mutogratopelofeedbackepelaaudincia
Abraos
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidade
hashmapemadvpl/?like_comment=16&_wpnonce=0e43020136)
Curtir
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=16#respond)
5. Rafaeldisse:
09/02/2015s17:52
Excelenteartigo,meajudoumuito!
Obrigado
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=48&_wpnonce=1bae06ce3c)
Curtidopor1pessoa
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=48#respond)
6. Dronidisse:
22/06/2015s11:23
OIJlio.
ofonteMATXFISpoderiasermelhoradanoprocessoseimplementadoHashMap?
Abraos
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=132&_wpnonce=bea07d403f)
Curtidopor1pessoa
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=132#respond)
Siga0984disse:
22/06/2015s12:24
Opa,vejamosEstefontecontmvriasfunes,somenteseriapossveldeterminara
eficciadeumarefatoraousandoHashMapmedianteaanlisedecadafuno.
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidade
hashmapemadvpl/?like_comment=133&_wpnonce=ad06fbf1e8)
Curtir
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=133#respond)
7. Lucianadisse:
10/07/2015s15:00

Nossaqueartigobacana.

https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

9/10

28/07/2015

PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

Nossaqueartigobacana.
Eufaziaissodeumaformatoarcaica,gosteidessenovasoluo
Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehash
mapemadvpl/?like_comment=146&_wpnonce=f9d3001fc8)
Curtidopor1pessoa
Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?
replytocom=146#respond)

CrieumwebsiteoubloggratuitonoWordPress.com(https://br.wordpress.com/?
ref=footer_website). OtemaBigBrother(https://wordpress.com/themes/bigbrother/).
Seguir

SeguirTudoemADVPl
CrieumsitecomWordPress.com(https://ptbr.wordpress.com/?ref=lof)

https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/

10/10