performance e escalabilidade – hash map em advpl

10
28/07/2015 Performance e escalabilidade – Hash Map em AdvPL | Tudo em ADVPl https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/ 1/10 T udo em ADVPl Compartilhando experiências de análise, programação e desenvolvimento. Performance e escalabilidade – Hash Map em AdvPL 16/12/2014 16/12/2014 Siga0984 ADVPL , Escalabilidade , Exemplos , Performance O que é um Hash Map ( ou Hash Table ) ? Em computação, uma tabela de hash (Hash Table) ou mapa de hash (Hash Map) é uma estrutura de dados que implementa um array associativo, também conhecido por chave‑valor, onde um determinado valor é acessado por uma determinada chave. Em muitas situações, esta estrutura é muito mais eficiente do que utilizar uma árvore de busca, array ordenado, ou qualquer outra estrutura de dados ou mecanismo de pesquisa. A partir do TOTVS Application Server, build 7.00.131227A, foram disponibilizadas um grupo de funções para a criação e manutenção de um Hash Map, inclusive a criação de um Hash Map a partir dos dados contidos em um array multi‑dimensional em AdvPL. Vantagens A vantagem da utilização do Hash Map em relação a outras estruturas é a velocidade de localização de um valor a partir da chave fornecida. Esta diferença de desempenho é mais perceptível quando temos um número maior de entradas ou elementos no Array. Desvantagens

Upload: joao-roberto-mendes-silva

Post on 04-Sep-2015

236 views

Category:

Documents


5 download

DESCRIPTION

Performance e Escalabilidade – Hash Map Em AdvPL

TRANSCRIPT

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    TudoemADVPl

    Compartilhandoexperinciasdeanlise,programaoedesenvolvimento.

    PerformanceeescalabilidadeHashMapemAdvPL

    16/12/201416/12/2014 Siga0984 ADVPL,Escalabilidade,Exemplos,Performance

    OqueumHashMap(ouHashTable)?

    Emcomputao,umatabeladehash(HashTable)oumapadehash(HashMap)umaestruturadedadosqueimplementaumarrayassociativo,tambmconhecidoporchavevalor,ondeumdeterminadovaloracessadoporumadeterminadachave.Emmuitassituaes,estaestruturamuitomaiseficientedoqueutilizarumarvoredebusca,arrayordenado,ouqualqueroutraestruturadedadosoumecanismodepesquisa.

    ApartirdoTOTVSApplicationServer,build7.00.131227A,foramdisponibilizadasumgrupodefunesparaacriaoemanutenodeumHashMap,inclusiveacriaodeumHashMapapartirdosdadoscontidosemumarraymultidimensionalemAdvPL.

    Vantagens

    AvantagemdautilizaodoHashMapemrelaoaoutrasestruturasavelocidadedelocalizaodeumvalorapartirdachavefornecida.EstadiferenadedesempenhomaisperceptvelquandotemosumnmeromaiordeentradasouelementosnoArray.

    Desvantagens

    Porm,amanutenodeumHashMap(acrescentarouremoverelementos)podeterumcusto

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    Porm,amanutenodeumHashMap(acrescentarouremoverelementos)podeterumcustomaior,inclusivedependendodaestruturainternadaimplementaodoalgoritmodehash,estecustodemanutenopodeaumentarproporcionalmentedeacordocomaquantidadedeelementosnomapa.

    Melhorcenrio

    Logo,omelhorcenrioparausodeumHashMappartedautilizaoemumArraydedadosnamemria,ondeduranteoprocessamentohaverpoucaounenhumamanutenonestemapa(acrescentarouremoverelementos),eaquantidadedebuscasrealizadasnestemapasejaapartesignificativadoprocessamento.

    Programadeexemplo

    ParailustrarumcasosimplesdeusodoHashMapemAdvpl,vamosaumprogramadeexemplo,ondesercriadoumarraycomrelativamentepoucoselementos(17),ondeaprimeiracolunaserachavedebusca,evamosrealizar50milbuscasparacadaumadas17chaves,mais50milbuscasporumachavenoexistente.

    Naprimeirapartedoprograma,asbuscassobreoArrayserofeitascomASCAN(),enasegundapartedoprograma,vamoscriarumObjetodeHashMapapartirdoArray,usandoafunoaToHM(),edepoisrealizarasmesmasbuscasusandooobjetodeHashMap.

    Aotodo,cadatestevairealizar900000(novecentasmil)buscas,ondeserocontabilizadosostemposdas50milbuscasparacadavalorporcadamtodo,eotempototaldetodasasbuscaspormtodoutilizado.

    SegueoprogramaAdvplabaixo.Apscompilado,elepodeserexecutadodiretamenteapartirdoSmartClient,atravsdafunoU_TSTHASH

    Fonte

    #includeprotheus.ch

    USERFunctionTstHash()

    LocalaDados:={}LocalnI,nJLocalnTimer,nTotalLocalcBuscaLocalnPos,xValueLocaloHash

    //Criaumarraydeduascolunas,com17elementos

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    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)+1IfnI>len(aDados)//BuscaporumelementoquenaoexistecBusca:="NE"Else//BuscaporumelementoqueexistenalistacBusca:=aDados[nI][1]EndifnTimer:=seconds()FornJ:=1to50000//Realiza50milbuscasnPos:=ascan(aDados,{|x|x[1]==cBusca})NextnTimer:=seconds()nTimerconout("Buscapor["+cBusca+"]demorou"+cValToChar(nTimer)+"s.")Next

    nTotal:=seconds()nTotalconout("TempoTotal(ASCAN)="+cValToChar(nTotal)+"s.")conout("")

    //AgorausandooHASHnTotal:=seconds()

    //CriaoObjetodeHASHapartirdoArrayoHash:=aToHM(aDados)

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    FornI:=1tolen(aDados)+1IfnI>len(aDados)//BuscaporumelementoquenaoexistecBusca:="NE"Else//BuscaporumelementoqueexistenalistacBusca:=aDados[nI][1]EndifnTimer:=seconds()FornJ:=1to50000//Realiza50milbuscaslFound:=HMGet(oHash,cBusca,@xValue)NextnTimer:=seconds()nTimerconout("Buscapor["+cBusca+"]demorou"+cValToChar(nTimer)+"s.")Next

    nTotal:=seconds()nTotalconout("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.

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    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,quantomaiselementosprecisamsercomparadosatquesejaencontradoondoarrayquesatisfazacondio,maiorotempodebusca.Opiorcenrioabuscaporumelementoquenoexiste,poisnestecasooASCAN()varreutodososelementosdoArrayparadeterminarqueovalornoexiste.Nomelhorcenrio,50milbuscasdoprimeirovalordoarraydemoraram0,359segundos,enopiorcenrio,quandoovalorbuscadoeraoltimovalordoarrayouquandoovalornoexistianoarray,50milbuscasdemoraram1,061segundos.

    Jcomousodoobjetodehash,criadoapartirdestemesmoarray,odesempenhodasbuscasfoiaproximadamente7,6vezesmaisrpido,ecadaumadasbuscas,noimportaseachavedebuscaestavanoincioounofinaldomapa,demoraramemmdia1/10desegundo.

    Concluso

    ComomencionadonotpicoMellhorCenrio,emumprocessamentoondeusamosumArrayemmemriacombaixaounenhumamanuteno,eumvolumemuitograndedebuscas,oHashMapumaalternativaexcelenteemcustoxbenefcio.

    Porm,lembresetambmdaLeideAmdahl:Oganhodedesempenhoquepodeserobtidomelhorandoumadeterminadapartedosistemalimitadopelafraodetempoqueessaparteutilizadapelosistemaduranteasuaoperao.Isto,seoseucasodeusocriaarrayspequenoseparapoucasconsultas,tomandoumtemponfimodeprocessamento,criarumHashMapsvaitedartrabalhoderefatorarseucdigo,evocnoterumganhoperceptvel,ouainda,nopiorcenrio,apresentarumapioranodesempenho.Nesteexemplofoiusadoumarraymuitopequeno,logoforamnecessriasmuitasbuscasparamostraradiferenadedesempenho.Cadatestecompletofez900milbuscasnoArraye900milusandoHashMap.

    AsfunesparalidarcomHashMapemAdvPLestodocumentadasnaTDN,apartirdolink

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

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

    LetsShare

    EsperoquevocstenhamgostadodalinhaderaciocnioecontedodisponibilizadosaquinoBlog.Noseacanheemcomentarseficoualgumadvidaousealgumapartedotextoficousempnemcabea.Sevocgostou,eachouestecontedotil,compartilhe,eseestelhefortil,useo.NoprximopostsobreHashMap,ofontedeexemplovaiutilizartodasasfunesdemanuteno,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.

    12comentriossobrePerformance eescalabilidade Hash Map emAdvPL

    1. FabioFongarodisse:

    Sobre estes anncios (https://wordpress.com/about-these-ads/)

    17/12/2014s06:12

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    Existerevisodousodesterecursoparaasfunesfiscaisdegeraodenotafiscalquequandousadascomoexecautosomuitolentas,poisvalidamlinhaalinha,campoacampo,emcascatatodososelementosdanota(acadanovoelementovalidamtodososanteriores)?

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=7&_wpnonce=a1ff9f558e)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=7#respond)

    Siga0984disse:

    OlFbio,boanoite,

    SobreaMSExecAuto()euconheoapenasopropsitodaimplementao,masnotenhodetalhesdecomoelafuncionapordentro,bemcomomeusconhecimentosnasregrasdenegciodoERPMicrosigatambmsobemsuperficiais.Nocaso,seinternamenteavalidaodetodasaslinhasreexecutadaacadanovoiteminseridonaMSExexcAuto(),acreditoquetrocarumarrayconvencionalparausarumHashnodevemelhorarodesempenhodesteprocesso.Oquemelhorariaserianorevalidartodosositensacadanovoitem,pormumavezconstatadoestecomportamento,deveserverificadosenoexistealgumaregradenegcioqueexijaarevalidaodetodosositens,comoporexemploumdescontoporitemquepodeseraplicadoatodosositensdanotacasoelaultrapasseumvalor.Umaregradenegciocomoessajustificariaanecessidadederevalidartodososelementos.

    Esperoterajudado

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=10&_wpnonce=de176a38e0)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=10#respond)

    2. SergioMartinezdisse:

    Excelenteartigoeumexemplomuitobemexplicadoeclaro.

    Parabns

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=8&_wpnonce=49ebb68003)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=8#respond)

    Siga0984disse:

    OlSrgio,obrigado

    17/12/2014s06:12

    Curtidopor1pessoa

    17/12/2014s23:23

    Curtir

    17/12/2014s06:23

    Curtidopor1pessoa

    17/12/2014s23:12

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=9&_wpnonce=9909672f94)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=9#respond)

    3. FbioMarginidisse:

    MuitolegalseublogJlio!Estousempreacompanhandoseusartigossempreumaprendizado.Parabns!

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=11&_wpnonce=87a1792280)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=11#respond)

    Siga0984disse:

    OlFbio,

    Gratopelofeedbackeporsuaaudincia

    Abraos!!!

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=13&_wpnonce=b0a21989c7)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=13#respond)

    4. AlvaroCamilloNetodisse:

    Muitolegalesseartigo!

    Aapresentaodosnovosrecursosdessejeitomaisdescontradoecomexemplosestexcelente.

    Jpasseioartigoparatodaaminhaequipe.

    Att

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=12&_wpnonce=e26368af2e)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=12#respond)

    Siga0984disse:

    Ollvaro,

    Curtir

    18/12/2014s07:51

    Curtir

    19/12/2014s20:49

    Curtir

    18/12/2014s11:04

    Curtidopor1pessoa

    22/12/2014s01:33

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    Quebomquegostou!Mutogratopelofeedbackepelaaudincia

    Abraos

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=16&_wpnonce=0e43020136)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=16#respond)

    5. Rafaeldisse:

    Excelenteartigo,meajudoumuito!

    Obrigado

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=48&_wpnonce=1bae06ce3c)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=48#respond)

    6. Dronidisse:

    OIJlio.

    ofonteMATXFISpoderiasermelhoradanoprocessoseimplementadoHashMap?

    Abraos

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=132&_wpnonce=bea07d403f)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=132#respond)

    Siga0984disse:

    Opa,vejamosEstefontecontmvriasfunes,somenteseriapossveldeterminaraeficciadeumarefatoraousandoHashMapmedianteaanlisedecadafuno.

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=133&_wpnonce=ad06fbf1e8)

    Responder(/2014/12/16/performanceeescalabilidadehashmapemadvpl/?replytocom=133#respond)

    7. Lucianadisse:

    Nossaqueartigobacana.

    Curtir

    09/02/2015s17:52

    Curtidopor1pessoa

    22/06/2015s11:23

    Curtidopor1pessoa

    22/06/2015s12:24

    Curtir

    10/07/2015s15:00

  • 28/07/2015 PerformanceeescalabilidadeHashMapemAdvPL|TudoemADVPl

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

    Nossaqueartigobacana.Eufaziaissodeumaformatoarcaica,gosteidessenovasoluo

    Curtir(https://siga0984.wordpress.com/2014/12/16/performanceeescalabilidadehashmapemadvpl/?like_comment=146&_wpnonce=f9d3001fc8)

    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)

    Curtidopor1pessoa