Gå til innhold

C++ og C# - Hardcore performace


Anbefalte innlegg

Jeg kunne utdypet spørsmålet med masse tekst og sløst med alle sin tid...

 

Hva gir best performance (kjappest utførelsestid på kode) gitt at du skal utføre en bestemt oppgave og ende med en MSIL fil?

 

Begge skal jo produsere MSIL kode, men vil de produsere identisk kode? Hvis ikke, hvilken vil gi kjappest kode? .NET har ikke eksistert i så mange år uten at noen har testet dette vel?

Lenke til kommentar
Videoannonse
Annonse

Det er jo en enkel sak å teste. Men skal du produsere ren IL så er det neppe noen stor endring i ytelse fra C++/CLI til C# hvis noen overhode. Grunnen til at C++/CLI kan være nyttig, er at en kan blande managed og unmanaged kode om hverandre (dog en må være klar over ytelsen som tapes ved skifte)

 

En bruker ikke C++/CLI fordi det er raskere, men det er nødvendig i noen programmer for å kunne lage en wrapper for et C++ bibliotek (nVidia PhysX eksempelvis)

Lenke til kommentar
Det er jo en enkel sak å teste.

 

Ok, men da gjør vi en test. Jeg er ingen performance programmerer, så jeg poster grunnkode for to programmer og modifiserer dem slik folk mener er best og tester.

 

C# kode:

namespace test {
   class Program {
       static void Main(string[] args) {
           const int numbers = 999999;
           var arr = new double[numbers];
           var r = new Random();
           for (int i = 0; i < numbers; i++)
           {

               arr[i] = r.NextDouble();
           }
           for (int y = 0; y < 5; y++)
           {
               var s = new Stopwatch();
               double average = 0.0;
               s.Start();
               for (int x = 0; x < 99; x++)
               {
                   for (int i = 0; i < numbers; i++)
                   {
                       average += arr[i];
                   }

                   average = average / numbers;
               }
               s.Stop();
               Console.WriteLine("{0} ms spent...", s.ElapsedMilliseconds);
           }
           Console.ReadKey();
       }
   }
}

 

C++ kode: (board fjerner <> koder...)

int main(array ^args) {
   const int numbers = 999999;
   array ^arr = gcnew array(numbers);
Random ^r = gcnew System::Random();
   for (int i = 0; i < numbers; i++)
   {		
	arr[i] = r->NextDouble();
   }

for (int y = 0; y < 5; y++)
{
	Stopwatch ^s = gcnew Stopwatch();
	double average = 0.0;
	s->Start();
	for (int x = 0; x < 99; x++)
	{
		for (int i = 0; i < numbers; i++)
		{
			average += arr[i];
		}

		average = average / numbers;
	}

	s->Stop();
	Console::WriteLine("{0} ms spent...", s->ElapsedMilliseconds);
}
Console::ReadKey();
   return 0;
}

 

Resultat C#:

1269 ms spent...

1198 ms spent...

1166 ms spent...

1165 ms spent...

1178 ms spent...

Gjennomsnitt: 1195.2 ms

 

Resultat C++:

916 ms spent...

915 ms spent...

910 ms spent...

890 ms spent...

910 ms spent...

Gjennomsnitt: 908.2 ms

 

Annen maskin, så ny baselinje (samme kode som over, beregnet på 3. kjøring):

C#: 84.8 ms

C++: 129.4 ms

(Kode kjørt uten IDE og Release settings.

 

Endringene til GeirGrusom:

C#: 86.8 ms

C++: 128 ms

 

Konklusjon: Under IDE er C++ klart raskere, men fjerner man IDE er C# raskere som man ser over. De små endringene i koden til GeirGrusom hadde forsåvidt liten effekt.

Endret av rozon
Lenke til kommentar

Sjekk også CIL koden som genereres, det er et poeng og også se hvorfor det går raskere.

 

Jeg får ikke kompilert C++/CLI på denne maskinen (mangler .lib filer for CRT av en eller annen grunn)

 

Prøv å bytt fra const int i C# til static readonly int, og fra const int i C++ til #define og se hvordan det påvirker ytelsen. Bytt også fra array^ til array<double> i C++

Lenke til kommentar
  • 2 uker senere...
<snip>

Konklusjon: Under IDE er C++ klart raskere, men fjerner man IDE er C# raskere som man ser over. De små endringene i koden til GeirGrusom hadde forsåvidt liten effekt.

 

Beklager å måtte ødelegge moroa, men denne testen som mange mange andre tester er altfor små til å gi et godt nok grunnlag for en sikker konklusjon.

 

Jeg tviler ikke på at du har fått rett svar, men jeg setter spørsmålstegn ved hvordan du har funnet svaret.

Lenke til kommentar
Jeg tviler ikke på at du har fått rett svar, men jeg setter spørsmålstegn ved hvordan du har funnet svaret.

 

Skal ikke påstå hva som er rett eller feil, det er ikke grunnen til spørsmålet en gang. Formålet er å se på en veldig enkel oppgave, og finne den optimale koden for hvert av språkene.

 

Svaret er ikke endelig og langt fra vitenskaplig.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...