06. juni 2001 - 13:16Der er
38 kommentarer og 1 løsning
??????
Jeg er bruger af Visual Basic 6.0, men jeg vil måske begynde på C++ så jeg vil vide om det er rigtigt at man skal skrive en masse for at gøre meget lidt. Og hvis der er nogle VB brugere som kan svare mig på \"hvad er bedst!!!\" C++ eller Visual Basic 6.0???
Du kan komme langt med erfaring i C++, da mange firmaer søger medarbejdere, der kan dette, samt der er mange programmeringssprog, der er bygget på C++ syntaksen. Basic derimod er der ikke rigtigt noget der ligner, så jeg syndes at mulighederne på den måde er ringere end i C++. Programmeringsmæssigt, er C++ mange ting - det kommer helt an på editoren - der er dem, som Borrisholt snakker om - det er nøjagtigt lige så nemme som VB (måske nemmere, men igen - jeg er c++ mand :) ), og så er der den goda gamle stil, hvor man sætter sig ned med sin notepad og en eller anden compiler (det er hardcore, og du skal lave MEGET for at nå lidt). Borlands C++ Builder, som Borrisholt snakker om, er nok den jeg vil anbefale dig, da du lydder som en der godt vil se resultaterne af din programmering hurtigt (har jeg ret?) :) Igen, er det måske bare fordi at jeg er C++ mand og anvender Borland C++ Builder selv :)
Hvis du programmerer i VB og gerne vil forstå C/C++ fra grunden er PowerBasic en god ide. Jeg har lært C/C++ ved hjælp af PowerBasic.
PowerBasic er en basic-kompiler der har alle C\'s pointer-egenskaber (indekserede pointere, code pointers osv.). Man kan lave ægte exe\'er og dll\'er der kører lige så hurtigt som i C/C++ og som fylder klart mindre end i C/C++. Mange VB-folks bruger PB til at lave hurtige dll\'er som de kalder fra VB. Ved at bruge PowerBasic kan du få C/C++\'s speed uden at skifte sprog! På længere sigt kan du uden de store problemer gå over til C/C++. Du kan læse mere på http://www.powerbasic.com
Jeg har også arbejdet meget med PowerBASIC, men jeg blev træt af at løbe panden mod muren hele tiden... Der er alt for mange problemer ved at bruge et sprog som ikke er objektorienteret. (Syntes JEG).
rasmusneckelmann -> Ja, PB burde være OO. Håber det kommer i version 7. Hvis ikke det kommer, dør PB. Hvis det kommer er jeg sikker på at de har lavet noget der er langt bedre end VB\'s \"børnehave-klasser\". Nu da VB går i stå på grund af .NET har PB alle chancer for at blive et stort sprog. Håber de tager chancen!
emileej -> Du har ret. Jeg så bare en chance for at reklamere for et sprog jeg syntes bruges alt for lidt i Danmark. Hvis du læser i forum\'et på PB\'s hjemmeside vil du se nogle meget begejstrede brugere. Hvis man har basic-baggrund er det et sus at få adgang til det store C-univers UDEN at skifte sprog.
PB Forum\'et er forøvrigt ret enestående. Det indeholder enorme mængder af brugbar kode, og hvis man kommer med et spørgsmål får man som regel svar fra erfarne PB-brugere inden for få minuter.
Jeg har lidt delphi kode på lager (jeg er også på arbejde) så må du nøjes med det :
var Digits:string; PDig:pchar; pos:integer;
procedure SetupDigits(len:integer); begin SetLength(Digits,len+2); Digits[1]:=\'3\'; Digits[2]:=\'.\'; pos:=3; Digits[pos]:=#0; PDig:=pchar(Digits); end;
procedure OutDig(dig:integer); begin Digits[pos]:=char(ord(\'0\')+dig); inc(pos); end;
procedure CalcPIOriginal(numdig:integer); var i,j,k,nines,predigit:cardinal; q,x,len:cardinal; pi:array of cardinal;
begin len := (numdig*10) div 3; SetLength(pi,len+1); for i:=1 to len do pi[i]:=2; nines := 0; predigit := 0; SetupDigits(len); for j:=0 to numdig do begin q:=0; for i:=len downto 1 do begin x:=10*pi[i]+q*i; pi[i]:=x mod (2*i -1); q:=x div (2*i-1); end; pi[1]:=q mod 10; q:=q div 10; if (q=9) then inc(nines) else if q=10 then begin OutDig(1+predigit); while nines>0 do begin OutDig(0); dec(nines); end; predigit:=0; end else begin if j>1 then OutDig(predigit); while nines>0 do begin OutDig(9); dec(nines); end; predigit:=q; end; end; OutDig(predigit); end;
Tag dig endelig god tid, så måler vi på mandag ....
Las os være enige om reglerne : alle kneb er tilladt. Dog ikke Assembler .... JEns B
Jeg syntes det skal være den samme grundlæggende kode vi bruger. Ellers bliver sammenligning lidt svær. pi.c ser OK ud for mig. Vi skal bare ha\' den op at køre i VC++. Jeg ser på det når jeg får tid
Jeg har endnu ikke ported min dims til C++. Meeen jeg har en Delphi dims der kan beregne PI på 0,1575 sekund på en PIII 1050 mhz. Måske vi hellere skulle måle i clock cykler ?
psp_psp >> KAN man lave en procedure i Asembler i Basic ? Fordi den eneste rigtige måleenhed vi har er clock cycels. Og til det SKAL man bruge assembler ....
I PB kan man slå over i asembler når og hvor man vil. Men var det ikke lettere at sende exe-filerne til hinanden, og så hverisær teste dem mod hinanden?
Jeg syntes ikke dette skal ende i en algoritme-konkurrence. Hellere en konkurrence mellem PB og C++. Det kræver at vi implementerer den samme algoritme. Defor ville jeg foreslå at du udpeger en C++ - algoritme, og så oversætter jeg den til PB. Hvad siger du til det?
Her er min kode: \'---------------------------------------- #compile exe \"calpi.exe\" #dim all #register none #include \"win32api.inc\"
global buffer as string global PDig as byte pointer global pos as long global pi as long pointer
sub SetupDigits(byval length as long) buffer = space$(length+2) : PDig = strptr(buffer) pos = 2 @PDig[0] = asc(\"3\") @PDig[1] = asc(\".\") @PDig[pos] = 0 end sub
sub CalcPI(byval numdig as long)
register q as long, qi as long local lppi as dword local predigit as long local nines as long local length as long local i as long local j as long local k as long local x as long
length = (numdig*10) \\ 3
dim arr_pi(length) as long mat arr_pi() = con(2) pi = varptr(arr_pi(0))
SetupDigits length
do i = length while (i>0) x = 10*@pi[i] + qi*i k = i+i-1 qi = x \\ k @pi[i] = x-qi*k decr i wend q = qi \\ 10
@pi[1] = qi-q*10
if (q=9) then incr nines elseif (q=10) then @PDig[pos] = 49+predigit incr pos
while (nines>0) @PDig[pos] = 48 incr pos
decr nines wend
predigit = 0
else if (j>1) then @PDig[pos] = 48+predigit incr pos
end if
while (nines>0) @PDig[pos] = 57 incr pos
decr nines wend
predigit = q end if incr j loop while (j<=numdig)
@PDig[pos] = 48+predigit incr pos
end sub
%NUM = 100
function pbmain
local qStart as quad, qStop as quad, qFreq as quad local p as double, i as long, f as double
for i = 1 to %NUM QueryPerformanceCounter qStart CalcPI 1000 QueryPerformanceCounter qStop QueryPerformanceFrequency qFreq f = (qStop - qStart) / qFreq p = p + f stdout format$(f, \"#.####\") next i
Peter >> JEg er ikke stiv i VB, men er der ikke noget med at den skal bruge en DLL der hedder noger alla Vbrun300.dll (eller et nyere versions nummmer) ? Hvad sker der hvis du fjerner den dll fra dit system ?
Ellers folt klaret. Jeg troede VB af 15% langsommere ... Lige er par spørgsmål : Er du sikker på at while er den hurtigste løkke struktur ? Der er det fx ikke i Delphi, der bruger man repeat until. I Assembler skal det blive til :
Det viser sig iøvrigt at hvis du lader den køre nogle gange så går det lidt stærkere. du kan fx. loope indtil alle dine resultater ligger under en bestemt (realistisk) værdi.
Jeg prøvede værdien 0.16 og i løbet af en 15-20 forsøg kommer den i gennem alle 100 forsøg .... Der for uden har jeg optimeret min kode yderligere.
Min bedste tid i Fredags : 0.151831 Min bedste tid i Dag : 0.149491
du skal nok ikke sætte værdien til 0.16 på din computer fordi din computer er en anelse langsommere end min .... Sæt den til en værdi som de fleste tider ligger under ...
Jeg bruger PB(PowerBasic)...ikke VB. Iflg. PB\'s egne beregninger er PB mellem 3 og 23 gange hurtigere VB.
PB bruger ikke en run-time-dll ligesom VB. PB er en \"rigtig\" kompiler der laver meget små exe\'er og dll\'er. Disse exe\'er og dll\'er kører nogenlunde lige så hurtigt som C (tilsyneladende lidt langsommere). Hastighedsforskellen kan skydes at VC++ laver noget optimering bag ryggen på dig. Ved du noget om det?
Min fordom er at VB ville køre meget langsommere. Er der en VB\'er der kunne tænke sig at lave testet?
Jeg vil prøve at sortere de langsomme run\'s fra, sådan som du foreslår
Peter >> Din exe fil generer den en DOS consol eller en GUI. Ikke fordi det er rigtig intresant om filen er 34 eller 14 kb (in real life altså).
Optimering .. Ja Compileren optimerer, dog ikke det kode her fordi det er skrevet ud fra en ide om hvilke Assembler instruktioner det skulle blive til. Koden er tænkt i optimeret assembler, og skrevet i Delphi. Koden er der efter portet til C++ og rettet til så det kompilerede kode bliver det samme .... (Det er ikke første gang jeg deltager i den her slags juleleje).
Consol-kompileren giver en consol (det er den jeg har brugt her) DLL-kompileren bruges til GUI.
Jeg kom ned på 0.2058 ved at bruge din metode.
I princippet skulle det være muligt for mig at skabe den samme assember-kode som dig (uden at bruge asm). Du har nok ret i at det har noget løkke-strukturen at gøre. Jeg prøver mig frem...
Peter >> Entenlig burde vi ikke flue-kneppe så voldsomt, i stedet burde vi lave nogle beregninger der taget LANG tid ... fx 1.000.000 decimaler 10 gange ... Og så måle tiden på DET. Det ville give et mere realistisk billede.
En klog mand har en gang sagt at hvis man skal lave performance tests skal det laves med et alm. ur med sekund viser. Det er det eneste der giver et realistisk billede.
Jeg vender tilbage i mogen med 10 x 1.000.000 cifere Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.