optimering af objekt pascal

, en historie om optimering.,,, denne artikel blev offentliggjort i delphi entreprenør, ophavsret pinnacle forlagsvirksomhed, inc. alle rettigheder forbeholdt.,,,,, at optimere objekt pascal, denne artikel behandler optimering af delphi kode baseret på standardiserede teknikker med fuldt kendskab til de forhold, der er omfattet af programmet, og en sag i har været svineheldige.en ildrager bibliotek er anvendt til at illustrere disse punkter.,,,, det er en historie om en simpel poker bibliotek og optimering af kode i delphi.poker bibliotek begyndte som en turbo pascal projekt for flere år siden, som jeg havde tænkt på at konvertere til delphi i nogen tid.da det skete, delphi 5 ramme hylderne, før jeg har fundet tid til at foretage omstillingen.,,, min første skridt var at omstrukturere biblioteket som en samt projekt.den oprindelige kode havde været rent proceduremæssigt.i sin nye form, biblioteket indeholder tre klasser for programmering pokerspil.det er mærkeligt nok - en kort klasse, dæk, klasse og en hånd klasse.dæk og hånd er efterkommere af en kort liste klasse.biblioteket støtter poker spil, som bruger hænderne af fem eller flere kort, er støtte til store og små variationer og støtter vilde kort.det var det sidste element, som viste sig at være det vanskeligste.jeg endte med at bygge et helt bibliotek med vilde kort støtte og anvendes som grundlag for den vilde kort udgave.,,, at validere bibliotek, jeg byggede en række ni test ansøgninger.blandt disse programmer til at teste oprettelse og flytning af et spil kort, om at give mig tilladelse til at samle alle fem kort og evaluere dem som et pokerspil, et program, der behandles og evalueres fem kort hænder af standardkvaliteten, et program, der gjorde det samme for syv kort hænder, en video spil poker, og fire benchmarks test af hastigheden af bibliotek med vilde kort og uden.,,, det tog et par uger til at opbygge det bibliotek, og processen gik glat.jeg var i stand til at bruge en del af de gamle pascal kode.det har vist sig at være både gode og dårlige.godt, for det skete konvertering sammen.dårligt, fordi jeg begik en lille fejl, som jeg vil forklare senere.i et par uger til projektet blev testet, og helt bortset fra et lille problem.det var for langsom til at være til nogen nytte.således begynder vores eventyr.resultaterne af den første hastighed forsøg, er opført i tabel 1,.,,,,, benchmark,,,,, hænder pr. sekund,,,,, samlede tid,,,,,,,,, nr. wild cards,,, 16490,,, 157.6,,,,,,,, en joker,,,,,,,,, 830.9 3453,,,,,,,,, to fjolser, 703,,, 4496.7,,,,,,,, vilde toere., n /a, n /a,,,,,,,,,,,, tabel 1.vilde kort bibliotek benchmarks - tider er i sekunder, delphi 5 på en 400mhz pentium ii med 128 mb ram,,,,,,, benchmark - programmer er meget enkel.hvert program skaber alle mulige fem kort hænder i et spil kort.det opfordrer de sethighvalues metode i hånden objekt, der vurderer hånd og returnerer en høj kreditværdighed og en høj navn.den høje kreditvurdering er lang hele tal, der anvendes som en smule område.den lave for 20 cent indeholder rækken af kortene i standard - poker.den høje for elleve cent indeholde side type.(en mere detaljeret forklaring, se biblioteket kilde, der er til rådighed til download). dette gør det muligt at sammenligne værdierne poker program med to hænder, ved at sammenligne deres høje seertal.for eksempel:,,, hvis [1]. hirating > side [2]. hirating så,,, benchmark - program anvender høje kreditvurdering til at fastslå den type hånd og holder en regne med alle normale former og det samlede antal hænder.dette er yderligere validering af biblioteket rutiner.i et 52 kort standard dæk, der er 2598960 muligt fem kort hænder, fire kongelige hedeture, 5108 standard hedeture osv. hvis de toneangivende rapporter forskellige numre, så ved vi, at der er et problem med evalueringen rutiner.,,, som du kan se, hver wild - card, der fører til, at ca. 80% fald i hastighed.jeg ville ikke gide løbe deuces wild benchmark.de to fjolser benchmark tog ca. en time og en fjerdedel til at fuldføre.de vilde toere benchmark ville have taget ca. 25 timer til at færdiggøre.,,, - - for at gøre det hurtigere, det første skridt er at finde ud af, hvad problemer er.de benchmarks, selv på et område, der skal arbejde.den metode, der anvendes til sats, vilde kort hænder beløber sig til omregning af den vilde kort i alle mulige udskiftning kort, og så kalder den faktiske vurdering rutiner.det er klart, at dette kunne bruge noget arbejde.,,, at finde andre områder til forbedringer, jeg har mit hemmelige kode profiler.jeg bruger stopur, en del af enhver qa fra turbopower.der er andre, der er til rådighed, og alle programmør burde have en.- jeg har ingen vilde kort reference i den her og ventet på denne betænkning.faktisk, jeg gik i seng.da biblioteket er lidt langsom, jeg løb den profil i aften.den næste morgen, 273 millioner funktion kræver senere, var resultaterne.se tabel 2.,,,,, antal opkald,,,,, procedure /funktion,,,,,,,,, 194922000 tcaapcardlist. getcard,,,,,,,, 14593208 swapcards,,,,,,,, 12994800 tcaapokerhand. copycardfromdeck,,,,,,,, 7787360 isstraight,,,,,,,, 5197916 isstraightflush,,,,,,,, 4203056 sortcardslowtohigh,,,,,,,, 3917000 rankstring,,,,,,,, 2615028 isflush,,,,,,,, 2598960 tcaapokerhand. sethighvalues,,,,,,,, 2598960 sethivalnowc,,,,,,,,,,,, tabel 2.ti mest kaldet rutiner i poker bibliotek.,,,, stopur vender tilbage til mange oplysninger.der er tidspunkter på hver rutinemæssige ringede, og den procentdel af den samlede dette beløb.i dette tilfælde er nogle af de vigtigste oplysninger i tabellen ovenfor.,,, den første ting at bemærke, er, at der er næsten 195 millioner opkald til getcard metode.det er forventet.hver side, vurderes af sethighvalues metode producerer 25 opkald til getcard.hver enkelt indkaldelse til copycardfromdeck skaber ti mere.den samlede er korrekt.så er det samlede beløb for copycardfromdeck.yderligere et hurtigt blik på de lister, der er ikke meget, der kan ændres i nogen af disse rutiner.de er hovedsagelig bare opgave erklæringer.,,, det er tid til at tænke som en god poker spiller i stedet for en programmør.der er 2598960 muligt fem kort hænder i en standard spil kort.40 af disse er direkte hedeture og fire af de direkte hedeture er royal hedeture.der er 5108 krise og 10200 hedeture i en standard - dæk.antallet af opkald til isstraight, isflush og især isstraightflush er helt ude i tovene.hver side er blevet testet tre gange for at se, om det er en ret.(faktisk 2.996336996336996336996336996337 gange, men hvorfor skændes?),,,, sethivalnowc er hovedparten af al den poker bibliotek for vurdering af store hænder.det prøver hver hånd over det og finder ud af, hvad den er.så det formater hånden, giver det en numerisk vurdering og et passende navn.for at gøre det, den kalder isstraight funktion, og flere andre.det gør det på en pæn måde, hvorpå med sammenligninger ordre fra højeste og laveste.det er et af vores problemer ligger.,,, hver side er undersøgt for at se, om der er fem af en slags.hvis det er, så er vi færdige.hvis det ikke er testet for at se, om det er en royal flush.det betyder test for at se, om det er en ret, en flush, en straight flush, og endelig en kongelig.hvis det er en royal flush, kontrol for at se, om det er en naturlig royal, eller hvis den bruger vilde kort.uanset hvad, er vi færdige.hvis det ikke er en royal, så er det testes for at se, om det er en straight flush, så prøven for krise gentages.se problemet?det er en dårlig algoritme.,,, optimering, 1, vores første forbedring er, at ændre rækkefølgen for prøvningen.denne gang, i stedet for at gøre det sikkert, jeg vil forsøge at gøre det på en klog måde.der vil være mange løsninger.hvor mange måder kan ti prøvninger anbringes?av!igen, det er tid til at tage min poker hat.,,, poker hænder kan opdeles i to forskellige typer.den første type indeholder to eller flere kort af samme rang.alle par, to par hænder, rejser, fulde huse, fire af den art, og fem, af den art der hænder, falder ind under denne kategori.i den anden kategori er alle hænder med kort af tilsvarende rang.disse omfatter kongelige hedeture, direkte hedeture, krise, hedeture og høje kort hænder.(et højt kort er defineret som fem ikke - forretningsmæssigt forbundne kort.), her er problemet i to mindre problemer.i hvert enkelt tilfælde, vi vil prøve en hånd mod en bestemt type kun én gang, og vi vil gerne prøve for sjældnere hænder efter de mere almindelige.psuedo kode for en delvis løsning er på 1.,,, optagelse 1.pseudo - kode for nye hånd - test.,,,, (test, første gruppe - hænder med kort af samme rang}, hvis isonepair, hvis isthreeofakind, hvis isfourofakind, hvis isfiveofakind, har fem, af den art der forarbejdning, andet (ikke 5, men fire af den art}, er fire ens behandling,,,,,,,,, hvis isfullhouse, er fuldt hus forarbejdning, andet (kun ture}, er tre af den slags forarbejdning, (hvis isthreeofakind}, (nr. rejser, hvad med to par.,,,,, hvis istwopairs, har to par forarbejdning, (hvis istwopairs},,,, har et par forarbejdning, (hvis isonepair},,, det ser ud, som om det skulle udføre bedre, men det er problemet.f er meget sværere at arbejde med.efter gennemførelsen af dette, jeg har testet det fastsatte ny insekter, der blev indført.ved anvendelse af nr. wild cards, biblioteket kan nu sats 25800 hænder pr. sekund.det er en god forbedring.men det er stadig ikke godt nok.benchmarking for to vilde kort ville stadig tage på en time - ti timer for fire.,,, optimering, 2, der går tilbage til den profil, jeg kan se, at swapcards er en masse.så vi bør se kode og finde de steder, hvor det er blevet kaldt.koden er kedelige.der er ingen måde end forsamling sprog, for at gøre det hurtigere.den sortering rutine er at swapcards i stedet for at gøre sit eget bytte.den slags rutine, er nævnt nedenfor:,,, procedure sortcardslowtohigh (var - - tcaaevaluationhand);,, var, leftcardpos, rightcardpos: heltal, begynder, for leftcardpos: = 2 - 5, i rightcardpos: = 5 til leftcardpos, hvis side [rightcardpos-1]. rang >,,, [rightcardpos]. rang, så, swapcards (side rightcardpos-1, rightcardpos);,,,,,, at ændre kodeksen til at gøre sine egne, der vil redde en funktion, hver gang en swap er foretaget.den slags rutine er sig over fire millioner gange.det bør give os nogle mere fart.det kan også være muligt at forbedre den selv.jeg har brugt lidt tid på andre algoritmer, men gav ikke noget teoretisk hurtigere mulige forbedringer, og i mange tilfælde satte tempoet lidt ned.årsagen til dette er længden af array kombineret med. mange af de andre sorteringsmetoder.,,, optimering, 3 - fastsættelse af en fejl, det er tid til at se på isflush funktion og alle sine søskende.koden er nævnt nedenfor:,,, funktion isflush (side: tcaaevaluationhand): boolean,,, begynder, resultat: = falske, hvis (side [1]. jakkesæt = side [2]. jakkesæt) og (side [1]. jakkesæt = side [3]. jakkesæt, og (side [1]. jakkesæt = side [4]. jakkesæt) og (side [1]. jakkesæt = side [5]. som så resultat: = sandt,,,,,,, der er ikke meget at gøre her.eller er der?hånden parameter er et system af regnskaber, og det er ved at blive vedtaget som en standard parameter - hvilket betyder på monitoren.ups.dum fejl.det er kode jeg kopierede form den oprindelige pascal bibliotek.de eneste ændringer jeg lavede var at tildele resultatet variabel i stedet for funktionen navn.jeg har noget, som ikke var nødvendige i stedet for noget, der ville have hjulpet.denne parameter, at side vil forbedre hastigheden betydeligt.,,, så gik jeg gennem resten til at finde nogen arrays, plader eller bånd, overføres til fungerer som standard parametre.ja, jeg fandt en masse af dem.med dette faste, biblioteket kan vurdere »38900 hænder pr. sekund ved hjælp af ingen vilde kort.ved hjælp af en joker, giver en respektabel 9800 hænder pr. sekund, optimering, 4, jeg næste kigget på, hvad de toneangivende resultater peger på.husk, at hver joker er at tilføje en 80% hastighed.årsagerne til, at det blev forklaret tidligere.jeg ventede på at ordne det, fordi jeg ikke havde regnet ud, hvad jeg skal gøre.lad os se på en lille del af kodeksen,.,,, wildcards: = numwildcards (side), sag wildcards, 0 (ikke interesseret i dette,, 1: begynde (et wild card), for wc5: = caaclubace til caaspadeking, begynder, temphand: =;,, temphand [5]. rang: = tcaarank ((wc5) mod 13), temphand [5]. jakkesæt: = tcaasuit ((wc5) div. 13);,,, jeg har virkelig brug for at teste alle 52 muligt kort?det er det sikreste, som et første forsøg.det virker.men det går langsomt.tid til at tage min poker hat igen.alle 13 rækker, skal testes.er jeg nødt til at teste alle fire?nej, jeg gør ej. her er hvorfor.den eneste betydning det har, er i at fastslå, om den er i form af en flush.den eneste måde, det kan gøre en forskel, hvis det passer dragten af de andre kort.jeg kan se en af de (ikke - vilde) kort og kun bruge det jakkesæt.her er, hvad den nye kode ud.,,,, wildcards: = numwildcards (side), sag wildcards, 0 (ikke interesseret i dette,, 1: begynde (et wild card), der begynder at starte (for jakkesæt i første kort), startcardpos: = ord ([1]. jakkesæt) * 13;,, endcardpos: = startcardpos + 12;,,, wc5: = startcardpos til endcardpos, begynder, temphand: =;,, temphand [5]. rang: = tcaarank ((wc5) mod 13), temphand [5]. jakkesæt: = tcaasuit ((wc5) div. 13);,,, nu i stedet for afprøvning af 52 varianter for hver vilde kort kan jeg kun prøvning af 13.denne ændring skal ske i to vilde kort og tre wild - card hænder så godt.(rutinerne for fire og fem wild - card hænder, ikke virker på samme måde og behøver ikke at blive ændret.) hastighed uoverensstemmelse mellem vilde kort og ikke - joker kort - kort evalueringer er blevet skåret ca. halvdelen.ved hjælp af en joker, biblioteket nu vurderer 22000 hænder pr. sekund og 12.000 hænder pr. sekund med to spøgefugle.,,, optimering, 5, femte optimering kommer fra "hellere være heldig end god skole i programmeringen.jeg var tilfreds med den fart på dette punkt, så jeg besluttede at prøve biblioteket i de andre udgaver af delphi.jeg startede med delphi - 1.siden snor type i delphi 1 er faste og misligholdelse erklæring svarer til en erklæring om streng [255], jeg har skabt to nye serie typer.man ville holde kortet navn.de andre vil holde hånden navn.,,, min erfaring med korte bånd har været, at de er meget, meget hurtigt.inprise vil sikkert gerne fase kort snor.flere snor typer komplicere gennemførelsen af sprog.jeg bruger dem i min kode, og jeg så ingen grund til ikke at anvende dem i alle udgaver af biblioteket.det vil holde det enkelt.men jeg ville teste dem.det viste sig at være den største "nyttiggørelse", jeg kunne gøre.se tabel 3.,,,,, de,,,,, tid (lavere = bedre),,,,, hænder /andet (højere = bedre),,,,, string -,,,,,,,,, delphi - 1, den,,, 12705, kort (?),,,,,, delphi 2,,,,, 117001 22.2, kort,,,,,,,, delphi 2, 32.3,,, 80361,,,,,,,,,,, delphi 3, 49,,,,, 52112, kort,,,,,,,, delphi 3,,,,,,,,, 37057 70.1,,,,,,, længe,,,,,,,, delphi 4, 54,,,,, 48111, kort,,,,,,,, delphi 4,,,,,,,,, 33105 78,5,,,,,,,,,,,, delphi 5,,,,,,,,, 110759 23.5,,,,,,, shortm,,,,,,,, delphi 5, 43.1,,, 43094,,,,,,,,,,,,,, tabel 3.standard poker bibliotek benchmark - hele tiden er i sekunder.alle prøver var drevet af en 400mhz pentium ii med 128 mb ram.,,,,, at ovennævnte prøvninger blev gjort mod standard udgave af poker bibliotek.lignende fart forskelle i begge.kort tråde er hurtigere ved hjælp af hver udgave af delphi.det mest slående forskel i delfi. 5.mangler i altid hurtigere?jeg har fået at vide, at delphi 5 omdanner kort bånd til den nye dynamiske betingelser inden for nogle operationer.dette bør gøre det kort i langsommere i disse operationer.i dette tilfælde, tråde, kun anvendes af navne på kort og på hænderne.denne støtte til fejlfinding.men den eneste manipulationer, der bliver gjort, er opgaver og concatenations.se tabel 4 for forbedringer ved hjælp af wild - card bibliotek.,,,,,, benchmark,,,,, hænder pr. sekund,,,,, samlede tid,,,,,,,,, nr. wild cards,,, 97161, 26,7,,,,,,,, en joker,,,,,,,,, 66424, 43,2,,,,,,,, to fjolser,,, 41719 75,8,,,,,,,, vilde toere,,,,,,, 14016,, 185.4,,,,,,,,,,,, tabel 4.vilde kort bibliotek benchmark - tider er i sekunder delphi 5 på en 400mhz pentium ii med 128 mb ram,,,, hvad bliver det næste?biblioteket synes nu hurtigt nok.14016 hænder pr. sekund på den langsomste test bør ske hurtigt nok.vi ved, det er hurtigt i delfi. 5.lad os prøve i alle versioner, og se, hvad der sker.tabel 5 indeholder resultaterne.,,,,,,,,, delphi 1,,,,, delphi - 2,,,,, delphi 3,,,,, delphi - 4,,,,, delphi - 5,,,,,,,,, nr. wild cards,,,,, 108920 12526,,,,,,,,, 40274 44267,,,,,,, 97161,,,,,,,, en joker,,,,,,,,, 69963 10037,,,,,,, 36770 33808,,,,,, 66424,,,,,,,, to fjolser,,,,, 43095 7306,,,,,,,,, 25995 27846,,,,,,, 41719,,,,,,,, vilde toere,,,,, 13590 2976,,,,,,,,, 11440 11766,,,,,,, 14016,,,,,,,,,,,, tabel 5.vilde kort bibliotek benchmark - hænder pr. sekund delphi 5 på en 400mhz pentium ii med 128 mb ram,,,,,,, en ny profil, som et sidste tjek, vi kører her igen og se, hvad vi får.se tabel 6.,,,,, antal opkald,,,,, procedure /funktion,,,,,,,,, 194922000,,, tcaapcardlist. getcard,,,,,,,, 12994800,,, tcaapokerhand. copycardfromdeck,,,,,,,, 4203056,,, sortcardslowtohigh,,,,,,,, 3917000,,, rankstring,,,,,,,, 2598960,,, makeaceslow,,,,,,,, 2598960,,, tcaapokerhand. sethighvalues,,,,,,,, 2598960,,, sethivalnowc,,,,,,,, 1876344,,, swapcards,,,,,,,, 1125312,,, makeaceshigh,,,,,,,, 1098240,,, setcardorderonepair,,,,,,,,,,,, tabel 6.ti mest kaldet rutiner efter optimizations,,,, det har ændret sig.den gode nyhed er, at ingen af de rutiner, ser ud til at blive kaldt mere, end de burde.de bedre nyheder er, at det er nok tid til at stoppe.biblioteket er hurtigt nok.kunne det være hurtigere?sikker.der er flere ting, som stadig kunne give nogle ekstra fart.men der lader ikke til at være noget, der vil få en enorm stigning.,,, fra nu af, små forbedringer vil være på dagsordenen.jeg har oprettet en ny mappe på min harddisk og kopierede det færdige bibliotek.det ville tjene som en eksperimentelle udgave, hvor idéer kan afprøves uden at arbejde.her er nogle af de ting, jeg har forsøgt med eksperimentelle udgave, der ikke har gjort det, at produktionen kode.,,,,, at sortering rutine med en "unrolled" boble.dette skaber en lang, grimt stykke kode, men giver en beskeden hurtighed, styrke.om to - tre procent.,,,,, erstatter rankstring funktion med en række konstanter, der indeholder rang navne.det giver også en beskeden stigning i hastighed.,,,,,, at kortet navn og navn områder og tilknyttede funktioner.dette giver en ti - procent hurtigere forbedring på bekostning af komplicerende fejlfinding.,,,,, tilføjet {$minenumsize 4} de direktiv til 32 bit versioner af bibliotek.dette styrker den ansvarlige for at gøre opregnede former 32 bit og tilføjer en lille hastighed øges.,,,,, bygning hænder i sethighvalues i sorteret.dårlig idé.det satte tempoet lidt ned betydeligt.,,,,, at bytte variabel i sortering rutine globalt.dette giver en meget lille hastighed øges.,,,,, at bytte variabel i swapcards rutine globalt.denne langsommere i programmet.,,,,, erstattet opkald til side, at rutiner med inline - kode med blandede resultater.gør det til et og to par hænder gjorde ting op.at de tre af den slags rutine satte tempoet lidt ned.(spørgsmål!),,,,, jeg fjernet den opfordring til at makeaceslow i høje side af rutine.det er en beskeden hurtighed, styrke.fjernelse af kodeksen fra biblioteket i alt årsager fart til at falde.(også underligt.et problem med kode placering i hukommelsen?,,,,,,,, kildekode, kildekoden til wild - card bibliotek, en ledsager, video, poker, bibliotek, en prøve video poker og alle offentlige tjenester, der er beskrevet i denne artikel, kan downloades fra http: //////////////charlesappel. mindspring. kom /.,,



Previous:
Next Page: