zeitmesseung



  • moin,

    ich vergleiche java mit c code und stoppe die zeit. dabei ist mir aufgefallen das c fast tausend mal schneller ist(beim kopieren von array elementen), da c neuland für mich ist wollt ich das ma jemand über den code guckt und sagt ob das richtig gemessen ist bin auch für formverbesserungenvorschläge dankbar.

    #include "stdafx.h"
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    double arraykopieren(){ 
    
    	 LARGE_INTEGER start,finish,frequenz;
    	 double a,b,c;
    
    	if (!QueryPerformanceFrequency(&frequenz))
    		printf("scheiße");
    
    	int array1[100000];
    	int array2[100000];
    	for(int i=0;i<100000;i++){
    		array1[i]=1;
    		array2[i]=2;
    	}
    	QueryPerformanceCounter(&start);  
    
    	for(int i=0;i<100000;i++){
    		array1[i]=array2[i];
    	}
    
    	QueryPerformanceCounter(&finish); 
    
    	a=finish.QuadPart-start.QuadPart;
    	b=frequenz.QuadPart;
    	printf("%f   %f\n",a,b);
    	c=a/b;
    
    	return c;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	printf("%f millisekunden",arraykopieren()*1000);
    
    	return 0;
    }
    


  • Die Frequenz brauchst du nur einmal abzufragen.
    Lass die CounterQueries doch in der Main und loope nur die arraykopieren Funktion.



  • Also der Visual C++ z.B. merkt ganz einfach dass Du ihn hier nur verarscht, und optimiert die beiden Schleifen komplett weg. Da ist es schwer verwunderlich dass "nichts" wesentlich schneller geht als irgendwas anderes 😉



  • wie optemiert der denn denn die schleifen und wie kommt es zu einem so großen unterschied zu java. oder besser gesagt den quellcode den ich da ausführe ist ähnlich dem in java dann müsste java ganz schön unvorteilhaft sein wenn man ne reihe von daten einfach nur bearbeitet und umschreibt.



  • nameac schrieb:

    wie optemiert der denn denn die schleifen

    Er merkt, dass die Werte nirgendwo benutzt werden, dass die Zuweisungen keine weiteren Effekte haben, kurz gesagt dass das Programm ohne die Schleifen exakt dasselbe Ergebnis liefert wie mit ihnen. Mit "weg"optimieren meinte ich hier übrigens genau das: Die Schleifen existieren im Assembler-Code nicht. Ihre Dauer: 0,0 Mikrosekunden.

    und wie kommt es zu einem so großen unterschied zu java.

    Vermutlich durchläuft das Java-Programm die Schleifen tatsächlich.


  • Mod

    wenn es hier um C vs. java geht, so hat das wenig mit C++ zu tun --> falsches forum

    grunsätzlich sind solche vergleiche zwischen programmiersprachen wenig sinnvoll, wenn man nicht beide beherrscht und ihre eigenarten kennt.



  • Bau mal nach dem

    QueryPerformanceCounter(&finish);
    

    noch Folgendes ein

    srand(time(NULL));
    printf("rand = %d, %d\n", array1[rand() % 100000], array2[rand() % 100000]);
    

    Das sollte die Optimierung des Compilers unterbinden.



  • @groovemaster,

    bleibt bei der gleichen geschwindigkeit, habe auch schon probiert alles in die main zu schreiben und das array in einer ausgabe zu nutzen war immer noch genauso schnell. 😕



  • Naja, das Array besteht ja nur aus 100k Elementen.
    Wenn du wirklich einen richtigen Geschwindigkeitsvergleich machen willst, solltest du größere Zahlen verwenden, damit das Ganze etwas genauer wird. Ich hab 10m Elemente verwendet und selbst da dauert es auf meinem Rechner nur 80 ms.

    typedef unsigned long ulong;
    ulong ArrayCopy()
    {
     const int ArraySize=10000000;
     int* Array1=new int[ArraySize];
     int* Array2=new int[ArraySize];
     for (int i=0;i<ArraySize;i++)
     {
      Array1[i]=i+i;
      Array2[i]=i*i;
     }
     ulong Start=GetTickCount();
     for (int i=0;i<ArraySize;i++)
     {
      Array1[i]=Array2[i];
     }
     ulong Finish=GetTickCount();
     delete[] Array1;
     delete[] Array2;
     ulong TimeNeeded=Finish-Start;
     return TimeNeeded;
    }
    

Anmelden zum Antworten