Avatar billede Slettet bruger
31. oktober 2008 - 11:02 Der er 21 kommentarer og
1 løsning

Effektivitet: C# vs. C++

Hej eksperter,

Jeg skal til at skrive et matematisk program, der foretager en frygtelig masse beregninger. Spørgsmålet er så, om der er en fordel i at skrive det med C++, eller om C# foretager samme beregninger lige så effektivt?
Avatar billede arne_v Ekspert
31. oktober 2008 - 11:39 #1
C# JIT compiler optimerer stort set lige så godt som C++ AOT compiler.

Jeg har leget lidt her:
  http://www.eksperten.dk/artikler/67

Min forventning uden at kende dit program vil være at:
  - bedste C# er 5% hurtigere end C++
  - bedste C++ er 15% hurtigere end C#
  - gennemsnittet for hele app ender på at C++ er 5% hurtigere end C#

Så kan du jo overveje hvor meget en 5% hurtigere CPU koster og udfra din timeløn
regne ud hvor meget ekstra tid du har til at kæmpe med nogle små C++ finesser. Det skal
nok måles i minutter.

Hastighed er ikke et godt argument for C++ !

(hvis du skal lave meget Windows interface, hardware interface, realtime kørsel
eller skal have et meget lille memory footprint så er C/C++ relevant)
Avatar billede Slettet bruger
31. oktober 2008 - 12:02 #2
Mange tak!
Programmet demonstrerer forskellige metoder til bestemmelse af naturkonstanten pi, hvorfor der er tale om forskellige algoritmer. Er der en fordel i anvendelsen af C++, hvis koden skrives med omtanke, og programmet kører over f.eks. en nat?
Avatar billede arne_v Ekspert
31. oktober 2008 - 12:10 #3
Den eneste måde du kan vide det med sikkerhed er ved at kode det både i C# og C++ og måle.

Men forventning er som sagt at C++ vil være en lille bitte msule hurtigere. Så hvis du
starter kl. 22 så vil C++ måske være færdig kl. 6 og C# være færdig kl. 6:20 !

Men nu ligger jeg lige 123 og 456 sammen og får 579.

Du skal bruge BigDecimal/BigFloat til at beregne PI med tonsvis af decimaler ??

I så fald vil din hastighed afhænge meget af den implementation. Mere end af sproget.

.NET's implementation af java.lang.BigDecimal har jeg ikke vildt meget fidus til. Hvilket
C++ lib vil du bruge ? Hvis det er et anerkendt et, så har jeg mere fidus til det !
Avatar billede arne_v Ekspert
31. oktober 2008 - 12:12 #4
Hvad bruger man idag til at beregne pi med ? Chudnovsky & Chudnovsky 1992 ?
Avatar billede Slettet bruger
31. oktober 2008 - 12:52 #5
Uha! Jeg er vist ikke den eneste matematiknørd her :)
Jeg sidder lige og læser her: http://www.matematiksider.dk/pi.html
Der er mange spændende og ja, jeg regner med at anvende deres rekordsættende formel... Hvis rekorden er fra 94, er det nok formlen fra 92, der nævnes sidst på den linkede side, right?
Jeg skal godt nok også læse lidt om selve matematikken... Jeg har (endnu) ikke den store forståelse for, hvordan disse algoritmer fungerer i praksis - hvordan ved man f.eks. hvor mange af de beregnede decimaler med 92-formlen, der er korrekte? Er det anslået ud fra antaget af beregninger (altså 14 nye korrekte cifre per beregning)?
Avatar billede arne_v Ekspert
31. oktober 2008 - 14:13 #6
Chudnovsky & Chudnovsky 1992 laver så vidt jeg ved kun 11 cifre per iteration.

Jeg gætter på at man kigger på både de matematiske egenskaber og den numeriske stabilitet,
når man vurderer om det er rigtigt på 1 million cifre eller kun 999999.
Avatar billede Slettet bruger
31. oktober 2008 - 15:40 #7
Okay. Jeg prøver lige at rode med noget kode og skriver tilbage, når jeg har stykket en test sammen.
Avatar billede Slettet bruger
31. oktober 2008 - 15:45 #8
Her er formlen med 14 cifre per iteration, forresten:
http://www.matematiksider.dk/pi/eqn30.gif
Avatar billede Slettet bruger
31. oktober 2008 - 16:05 #9
Okay, lige et spørgsmål mere...
Jeg har fundet BigInteger.substract og lignende, men hvordan sammenligner jeg BigIntegers? F.eks. BigInteger > BigInteger.
Avatar billede Slettet bruger
31. oktober 2008 - 16:19 #10
Nu fandt jeg ud af det :) Men:

        public static long Faculty(long n)
        {
            long f = n;
            for (long i = n - 1; i > 1; i--)
                f *= i;
            return f;
        }
        public static BigInteger Faculty(BigInteger n)
        {
            BigInteger f = n;
            for (BigInteger i = n.subtract(ToBI(1)); i.compareTo(ToBI(1)) > 0; i.subtract(ToBI(1)))
                f.multiply(i);
            return f;
        }
Avatar billede Slettet bruger
31. oktober 2008 - 16:20 #11
... der får jeg intet ud af at bruge BigInterger-overload'en! Når jeg bruger denne kode:

namespace PiTestChudnovsky
{
    class Program
    {
        static void Main(string[] arguments)
        {
            Console.WriteLine("Hello, World!\nFaculty 4 is " + Mathematics.Faculty(Mathematics.ToBI(4)).ToString() + ".");
            Console.ReadKey(true);
        }
    }
}

... står der simpelthen intet i konsollen! Bruger jeg derimod denne kode:

namespace PiTestChudnovsky
{
    class Program
    {
        static void Main(string[] arguments)
        {
            Console.WriteLine("Hello, World!\nFaculty 4 is " + Mathematics.Faculty((long)4).ToString() + ".");
            Console.ReadKey(true);
        }
    }
}

... fungerer det perfekt, og konsollen indeholder teksten:

Hello, World!
Faculty 4 is 24.

Hvad er der galt?
Avatar billede arne_v Ekspert
31. oktober 2008 - 16:25 #12
multiply og subtract ændrer ikke objektet - de returnerer en ny vaerdi
Avatar billede arne_v Ekspert
31. oktober 2008 - 16:31 #13
f.multiply(i);

gør intet - du ønsker:

f = f.multiply(i);
Avatar billede Slettet bruger
31. oktober 2008 - 16:56 #14
Pokkers!
Jeg havde lige skrevet en masse, men endnu engang forsvandt det, da jeg trykkede send... Forpulede Eksperten...
Anyway, jeg skriver det lige igen.

Nu virker det! Dog har jeg et (måske) sidste spørgsmål: Hvordan kan jeg omdanne BigInteger til BigDecimal?
Avatar billede arne_v Ekspert
31. oktober 2008 - 17:18 #15
BigDecimal har en constructor som tager en BigInteger som argument.
Avatar billede Slettet bruger
31. oktober 2008 - 19:01 #16
Skønt! Mange tak :) Smid bare et svar, så tror jeg, jeg kan klare mig herfra.
Avatar billede arne_v Ekspert
31. oktober 2008 - 19:04 #17
svar
Avatar billede arne_v Ekspert
31. oktober 2008 - 19:06 #18
Og check performance. Jeg er som sagt skeptisk overfor performance af BigDecimal i vjslib.

Et godt C++ lib som GMP kunne vaere markant bedre.
Avatar billede Slettet bruger
31. oktober 2008 - 19:49 #19
Hm, hvordan opløfter jeg BigDecimals i potenser? Jeg har googlet mig frem til pow(int), men den metode kender VC# ikke.
Avatar billede Slettet bruger
31. oktober 2008 - 19:50 #20
Ja, jeg tester med det samme, om performance er i orden - men jeg skal lige have det til at fungere først :o)
Avatar billede arne_v Ekspert
01. november 2008 - 01:48 #21
pow er først i Java 1.5 - J# implementerer (det meste af) Java 1.1

du bliver nødt til at multiplicere
Avatar billede Slettet bruger
01. november 2008 - 01:57 #22
Tak.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester