Testprogramm: C++ ist erheblich langsamer als c# ?

Fischhirn

Enthusiast
Thread Starter
Mitglied seit
04.10.2005
Beiträge
3.597
Ort
Münster
Hi ihr Luxxer,

erstmal entschuldigt diese pauschale Aussage im Titel - diese Frage stellt sich hier nur in meinem speziellen Fall.. :d
ich habe gerade für meine Bachelorarbeit ein kleines Testprogramm geschrieben, um mich später für eine Programmiersprache entscheiden zu können. Dabei ist mir das Ergebnis doch sehr ins Auge gesprungen..

Hier erstmal der Code:

C#
Code:
static void Main(string[] args)
        {
            string dataName = @"D:\test.dat";
            Stopwatch watch = new Stopwatch();
            Random random = new Random();
            watch.Start();

            for (int i = 0; i < 1000; i++)
            {
                
                //dummes gerechne
                double bla = 2;//random.NextDouble();
                double aboh = 3;// random.NextDouble();
                double jo = (bla * aboh) * 100;
                double add = jo + jo;
                double sub = add - aboh;
                
                //datei erstellen
                BinaryWriter write = new BinaryWriter(File.Create(dataName));

                //random byte-Array rein schreiben
                byte[] data = new byte[1000000];
                //random.NextBytes(data);
                write.Write(data);
                write.Close();

                //datei in byte-Array lesen
                BinaryReader read = new BinaryReader(File.OpenRead(dataName));
                data = read.ReadBytes((int)read.BaseStream.Length);
                read.Close();

                //datei wieder löschen
                File.Delete(dataName);
                
            }



            watch.Stop();
            double time = watch.ElapsedMilliseconds;
            Console.WriteLine(time.ToString() + " ms");
            Console.ReadKey();
        }

C++
Code:
int _tmain(int argc, _TCHAR* argv[])
{
    std::string dataName = "D:\test.dat";
    
    LARGE_INTEGER ticksPerSecond;
    LARGE_INTEGER tick1, tick2;   // A point in time
    LARGE_INTEGER time;   // For converting tick into real time

    QueryPerformanceCounter(&tick1);

    for (int i = 0; i < 1000; i++)
    {      
        //dummes gerechne
        double bla = 2;
        double aboh = 3;
        double jo = (bla * aboh) * 100;
        double add = jo + jo;
        double sub = add - aboh;

        ofstream datei(dataName, ios::app);  //Öffnen der Datei
        byte b[1000000];
        datei << b; //In die Datei schreiben
        datei.close();   
        // Datei schließen

        ifstream rd(dataName, ios::binary | ios::ate); 
         // TestFile wird als Binaerdatei geöffnet. 
         streamsize len =  rd.tellg(); 
         char* buf = new char[len];  // Puffer zum Einlesen  der Datei 
         rd.seekg(ios::beg, 0); 
         rd.read(buf, len);    // Datei in Puffer lesen 
         rd.close();

          _unlink("D:\test.dat");//Datei löschen

    }

    QueryPerformanceCounter(&tick2);
    QueryPerformanceFrequency(&ticksPerSecond);
    time.QuadPart = tick2.QuadPart - tick1.QuadPart;

    std::cout << "Run time : " << (double)time.QuadPart/(double)ticksPerSecond.QuadPart << std::endl;
    cin.get();
    return 0;
}
In dem Programm sollen nur die Grundrechenarten abgeackert werden und danach immer 1Mb-Große Dateien erstellt, gelesen und gelöscht werden. Mehr nicht.
Dabei brauchte das C#-Programm 1,4 Sekunden und das C++-Pendant satte 8,8 Sekunden?
Lässt man das ganze Dateigedöns weg, sind beide Sprachen fast identisch schnell. Auch mit Random-Werten, die ich in diesem Beispiel ausgelassen habe.

Ich habe den C++ Teil nur mit google hingebastelt und kenne mich in der Sprache nicht gut aus.. eventuell habe ich einfach etwas sehr schlecht umgesetzt und es geht effektiver? Kann wer was dazu sagen? :d
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Hallo Fishhirn,

btw: schicker name habe mich schlapp gelacht :d

Also erstmal eins vorweg: C++ ist erheblich langsamer als c# das ist grundsätzlich nicht richtig, aber ich will hier auch keinen Flameware anzetteln, das bringt eh nix. Ich kann dir aus langjähriger Praxiserfahrung in beiden sprachen sagen, das beide sprachen Ihre stärken und schwächen haben, auch was Performance angeht. Es ist auch stark Abhängig wie man den Code schreibt, aber ich muss gestehen das C# nen zacken schneller ist als .Net. Zu beachten ist aber das .Net nicht C++ ist, es ist lediglich ein Framwork (welches ich auch als langsam und träge empfinde, wenn du stattdessen Qt verwendest sieht das auch wieder anders aus). Das lasse ich jetzt mal so im raum stehen. Warum dein C++ Programm so langsam ist... naja der Code ist nicht so dufte. Entscheidend können hier Compiler-Settings sein, oder das dein "simples" Programm massig Overhead erzeugt, schreib das mal in Plain-C++ (std C++ ohne .Net-Framework) wirst sehen, da sieht das ganz anders aus. Das nächste ist hast du das in der Debug Version oder Release Version getestet? Debug zu Vergleichen ist in meinen Augen Käse nur Release zählt, denn das ist die Version die ausgeliefert wird. Aber um dein Problem vorran zu treiben, was willste denn bauen? Eventuell kann ich dir bei der Entscheidung der Sprache helfen. Hier ist ein Test C# vs. .Net sehr ausführlich aber auch recht komplex und recht trockene Lektüre, wenn man beide Sprachen nicht richtig kennt (Was ich dir hier nicht unterstellen will, also nicht falsch verstehen). Head-to-head benchmark: C++ vs .NET - CodeProject®

Wie du schon sagst kennst du dich mit C++ nicht so gut aus, dann empfehle ich dir hier ganz klar C# für deine Bachelorarbeit (aber wie gesagt wenn du mir sagst worum es geht, kann ich besser helfen). C++ hast mehr Möglichkeiten aber wenn du dir in den Fuß schießt ist gleich das ganze Bein weg, oder wenn man es nicht richtig macht. Die Einarbeitung in C# finde ich wesentlich einfacher.

Hoffe das bringt dich den einen oder anderen Schritt weiter.

so long
lindsey
 
Zuletzt bearbeitet:
@ CyRu$

denke aufgrund der Uhrzeit war lindsey eifnach nur müde :fresse:

und @ lindsey: vielen Dank schon mal :)
Das man zwei Sprachen nicht pauschal miteinander vergleichen und sagen kann "x ist immer schneller als y", ist mir klar.
Wie auch schon erwähnt, habe ich mir den C++ code zusammen kopiert, da ich den C#-Code schon lange hatte und den eben nur Übersetzen wollte.

Beide Programme habe ich mit Visual Sudio 2010 C# bzw. C++ geschrieben und mit dem Release getestet^^
Hab mir auch schon gedacht, dass mein Code wirklich nur seinen Zweck erfüllt, aber in keinster Weise optimal ist :fresse: Daher auch die Frage, was man da besser machen kann?

Meine Bachelorarbeit befasst sich mit einem benutzerfreundlichen Programm, mit dem man schnell und einfach Messdaten öffnen/betrachten und im kleinen Umfang auch analysieren können muss.
Die Dateien sind teils rieseg (mehrere Gigabytes) und daher muss ich viel von der Festplatte aus anpacken und kann nicht direkt alles in den RAM laden :fresse:
Daher der Benchmark, um meinem Prof nen guten Grund zu geben, wieso ich C# genommen habe (ja richtig vollendete Tatsachen, ich weiss schon vor dem test was raus kommen muss :fresse: ). Extra schlecht machen will ich C++ aber trotzdem nicht.. Ging davon aus, dass die Sprache gleich schnell oder schneller ist.

Hab mich direkt für C# entschieden, weil die lösung relativ schnell nutzbar sein musste und ich mich eben damit schon auskenne.. C++ ist für mich ein reines Mienenfeld der Programmierung :fresse:
 
Zuletzt bearbeitet:
Also um Messdaten wirklich einfach auszuwerten würde ich DIAdem nehmen, von National Instruments... das ganze kann mit VB-Script "programmiert"/automatisiert werden...

vorallem hat man dort dann auch gleich die ganzen Diagramme und Funktionen dabei :) ist echt simpel :) hab da schon einige sachen für Kunden gemacht, falls deine Uni eine Lizenz besitzt würde ich mir das mal anschauen, wenn nicht einfach mal direkt NI anschreiben und nachfragen :)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh