pointer schneller als variablen/arrays ?



  • hi all
    alle sagen, pointer sind schnell, sicher einfach unersetzbar. ok, wenn es um dynamische verwaltung von listen geht stimm ich dem zu, aber schneller ???
    man schaut sich das programm an:
    2 x bubblesort algorythmus (1 x mit einem normalen array und 1 x mal mit einer kopie des arary, hmm eigentlich nicht ganz richtig, was ich sagen wollte ... ähh, ein pointer array, welches auf die elemente das orginals zeigt 🙂
    was wollte ich damit bezwecken ??
    naja eigentlich nur mal schauen, ob pointer wirklich so schnell sind wie alle sagen, das ergebnis hat mich aber etwas erschüttert ^^

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX 16000 
    
    int  main() {
    	int a[MAX], *pa[MAX]; 
    	int i,j;
    	int tmp, *ptmp;
    	long zeit;
    
    	srand(time(0));
    
    	for(i=0; i<MAX; i++) { 
    		a[i]=rand()%9999;
    		pa[i]=&a[i];
    	}
    
    	zeit=time(0);
    	printf("sortierung durch pointer\n");
    
    	for(i=0; i<MAX; i++) {
    		for(j=(i+1); j<MAX; j++) {
    			if(*pa[i]<*pa[j]) {
    				ptmp=pa[i];
    				pa[i]=pa[j];
    				pa[j]=ptmp;
    			}
    		}
    	}
    
    	printf("der vorgang dauerte %ds(pointer)\n",(time(0)-zeit));
    	printf("sortierung durch variablen\n");
    
    	zeit=time(0);
    	for(i=0; i<100; i++) 
    		printf("%d\n",a[i]);
    
    	for(i=0; i<MAX; i++) {
    		for(j=(i+1); j<MAX; j++) {
    			if(a[i]<a[j]) {
    				tmp=a[i];
    				a[i]=a[j];
    				a[j]=tmp;
    			}
    		}
    	}
    
    	printf("der vorgang dauerte %ds(variablen)\n",(time(0)-zeit));
    
    	return 0;
    }
    

    wenn man da sso ausfürt, stellt man fest, das bubblesort mit pointer um rund 40% langsamer ist als mit "normalen arrays" (jaja ich weis, an sich sind es auch pointer blabla).

    wahrscheinlich ist der vorgang bei euch ratzifatz beendet und die zeiten sind gleich 0s ^^
    dann stellt doch die anzahl bei MAX etwas höher ... ihr müsst halt mal guggN.
    ich hab es getstet auf einem dualboard 2xPentium MMX mit jeweils 200MHz, wobei nur effektiv eine CPU am rechnen war. naja der RAM war auch nur mit 128MB bestückt.
    ihr könnt ja, wenn ihr wollt (ich hoffe es zumindest, eure ergebnisse hir her posten aber bitte die zieten nenne, das MAX und eure hardware (CPU RAM))

    so aber nun zu meiner frage:
    wieso sind pointer in diesem fall so langsam ?
    warum sollte ich eine kopie des array anlegen ode rbesser gesagtm, wieso sollte ich ein pointer array auf ein array zeigen lassen und erst dann sortieren (naja eigentlich adressen tauschen) ?



  • sortier doch mal größere objekte. sagen wir mal welche, die durchschnittlich 200 bytes groß sind.



  • Kann ich Dir beantworten:

    Beim Sortieren des Arrays greifst Du auf die Variablen zu und kopierst 4-Byte Zahlen.

    Beim Sortieren des Pointer-Arrays greifst Du auf die Pointer zu, dereferenzierst diese und kopierst 4-Byte Adressen.

    Das macht genau zwei Operationen pro Durchlauf mehr (die Derefs).



  • (jaja ich weis, an sich sind es auch pointer blabla).

    Nein, sind sie nicht! Der Name eines Arrays ist ein const-Pointer auf das erste Element des Arrays.



  • GPC schrieb:

    Der Name eines Arrays ist ein const-Pointer auf das erste Element des Arrays.

    Nope.



  • groovemaster schrieb:

    GPC schrieb:

    Der Name eines Arrays ist ein const-Pointer auf das erste Element des Arrays.

    Nope.

    Komm schon, rück mal die Erklärung raus 😃

    EDIT: (Aus C-Tutorial auf dieser Seite hier: Additional Topics and Code, Abschnitt Arrays and Pointers)

    The name of a singly dimensioned array is a constant pointer to the first element of the array. Note that we can use it logically as if this is true, because we know that it has to act like this even if the system stores it in some funny place.



  • GPC schrieb:

    groovemaster schrieb:

    GPC schrieb:

    Der Name eines Arrays ist ein const-Pointer auf das erste Element des Arrays.

    Nope.

    Komm schon, rück mal die Erklärung raus 😃

    "kann verwendet werden wie" statt "ist" und die Liste von Ausnahmen aus meiner sig

    <edit>Huch, wo ist die hin?</edit>



  • arrays sind keine pointer.
    arrays werden bei vielen gelegenheiten zu pointern gecastet.
    arrays und pointer kann man mit der index-schreibweise verwenden: foo[index]
    die groesse eines pointers ist abhaengig von der architektur. im allgemeinen ist das 32 oder 64 bit, also eine groesse von 4 oder 8 byte.
    die groesse eines arrays ist die laenge in bytes des benutzten speichers.
    2d arrays gibt es in 2 varianten: als array von pointern, die wiederum auf arrays zeigen (int **a = malloc(sizeof(int*) * rows);...) und als autoarray (int arr[rows][cols]), das an sich ein durchgehender speicherbereich ist, aber die indexschreibweise vom compiler umgewandelt wird ([row][col] -> [col + row*colcount]).



  • SG1 schrieb:

    GPC schrieb:

    groovemaster schrieb:

    GPC schrieb:

    Der Name eines Arrays ist ein const-Pointer auf das erste Element des Arrays.

    Nope.

    Komm schon, rück mal die Erklärung raus 😃

    "kann verwendet werden wie" statt "ist" und die Liste von Ausnahmen aus meiner sig

    <edit>Huch, wo ist die hin?</edit>

    Aus "C++ Lernen und professionell anwenden" (3-8266-0824-0), 3. Auflage, Seite 371:

    In C++ bezeichnet der Name eines Vektors zugleich die Anfangsadresse des Vektors. Genauer: Ein Vektorname ist ein Zeiger auf das erste Vektorelement



  • arrays sind keine vektoren und wir sind bei ansi c. in c++ gibts dinge, die wirklich vektor heissen und mit pointern weniger zu tun haben.

    solche buecher druecken sich ungenau aus. der name eines arrays kann wie ein pointer auf das erste element verwendet werden. als operand zu sizeof verhalten sich arrays und pointer jedoch unterschiedlich (wie gesagt).

    akzeptiere diesen unterschied einfach. arrays und pointer sind sehr aehnlich, jedoch nicht das gleiche.



  • GPC schrieb:

    Komm schon, rück mal die Erklärung raus 😃

    Kleiner Tipp: da wir das Thema schon öfters hatten, sollte dir die Suche weiterhelfen.
    Aber um's kurz zu machen, die vielleicht passendste Erklärung ist folgende:

    Ein Array kann bei Bedarf implizit in einen Zeiger auf das erste Element umgewandelt werden.

    Man beachte, dass hier weder Casten noch Gleichnisse erwähnt werden.
    Letztendlich hat das zur Folge, dass Arrays oftmals ähnlich wie Zeiger verwendet werden können, es sind aber definitiv keine Zeiger. Deine Referenzen sind somit falsch und bedeutungslos. IIRC hab ich schon mal entsprechende Passagen aus dem Standard gepostet, evtl. hilft dir auch dabei die Suche weiter.


Anmelden zum Antworten