02. oktober 2007 - 00:44Der er
13 kommentarer og 1 løsning
C# outperforms vb og c++
Jeg har noget kode som jeg gerne vil portere til VB og c++. Ikke desto mindre finder jeg eksekverings hastigheden i VB og c++ rystende langsom i forhold til c#. Er der nogen der kan forklare om jeg kan optimere mit VB kode... og mit c++ u/pointere kode. Her er tiderne:
1) c#: 0.3 sec 2) c++ u/pointere: 1.4 sec 3) c++ m/pointere: 0.015 sec 4) VB: 25 sec
Koden er som foelger: 1) c#: int count = 1024 * 3 * 768;
byte[] bs = new byte[count];
DateTime start = DateTime.Now;
for (int h = 0; h < 100; h += 3) { for (int i = 0; i < count - 1; i += 3) { byte r = bs[i + 2]; byte g = bs[i + 1]; byte b = bs[i + 0];
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Derudover kommer at det kun er C# koden der beregner count uden at gå igennem andre variable. Det gør det nemmere for compileren at optimere en smule ved at beregne værdien på forhånd, så det bliver en konstant (dermed ikke sagt at C++ compileren ikke måske kan spotte at det er det der sker, men det kan man jo ikke være sikker på).
Ok, jeg kan se at eksemplerne ikke laver helt det samme. Jeg har nu aendret dem alle til det samme:
- loeb et rgb billede igennem 100 gange m. stoerrelsen 1024 * 768 - Alle i release mode
C#: 0.56 sec c++ u/pointere: 0.4 sec c++ m/pointere: 0.4 sec vb: 25 sec
Nu kan jeg bedre lide det... c++ er hurtigere end c#, hvilket jeg mener er paa sin rette plads. Ikke desto mindre ser jeg VB rode nederst, hvilket er aergeligt da jeg hellere vil skrive en ActiveX i VB end i c++.
Arne: Selvfølgelig - og jeg ved skam også godt at den vil blive udført inden tidstagningen starter - men jeg nævner det primært for at pointere at der er flere forskelle end som så. C# koden bruger heller ikke GetTickCount som de tre andre, men DateTime.Now - den kan faktisk godt gå hen og skabe en forskel, omend det nok mest er i nøjagtigheden af timingen.
Hvis vi skal komme med et reelt optimeringstrick der måske kan spare tid, så var det at bruge bitvis NOT i stedet for at trække 255 fra. Det kan godt være en smule hurtigere, omend det afhænger af om kilde og destination er identisk (endnu et punkt hvor der er lidt uenighed, men hvis det er har du ikke brug for de midlertidige r, g og b-variable), og i så fald om compileren er smart nok til at operere direkte på den placering i hukommelsen, eller om den vil hente ud i en intern variabel.
Vores hjemmeside target'er windows, mac og linux brugere :-) Vi har lavet en survey paa vores hjemmeside, og lidt under halvdelen havde .net installeret (af dem som kommer fra windows), hvilket gjorde at vi saa bort fra denne mulighed. Bemaerk at vi ikke kun skal bruge activeX'en paa vores hjemmeside, men ogsaa i vores program.
Hvilke muligheder er der ellers?
Jeg kunne forestille mig at idet jeg har en activeX kontrol i c++, saa er det ikke saerlig svaert at lave noget tilsvaerende indenfor MAC verdenen og indenfor linux verdenen...
Nej - der eksisterer ikke umiddelbart noget der svarer til ActiveX til andre platforme. ActiveX er en del af COM/OLE/og-hvad-ved-jeg.
Du kan lave plugins til andre browsere, men det er en lidt anden løsning.
Server side er en Java applet et HTML tag der outputtes on en binær fil der serves af web serveren. Den kan laves i ASP.NET, PHP eller pure HTML.
Du får også et problem med Java idet ikke alle har installeret Java.
Men du kan få Java til alle de nævnte platforme. Og du kan bruge præcis samme Java applet til dem alle.
Hvis folk har en nyere Java, så burde den performe mere ligesom C++/C# end som VB6.
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.