Hilfe mein Code ist super lahm





  • <windows.h> includen und dann mit GetTickCount().

    Das gibt dir die seit dem Rechnerstart vergangenen Millisekunden.

    int start = GetTickCount();
    
    zu_messende_funktion();
    
    int ende = GetTickCount();
    
    int zeit_die_benoetigt_wurde = ende - start;
    


  • Also dieser Codeteil braucht über 18000 tics. ich vermute mal das sind dann 18 sekunden? ein 2. codeteil ist ähnlich aufgebaut und braucht auch fast so lange.

    start=GetTickCount();
    
        // Socket erzeugen
        sock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,NULL);
        if (sock == -1) {
            perror ("socket()");
            exit (EXIT_FAILURE);
        }
    
        // Adresse des Servers festlegen
        memset( &host_addr, 0, sizeof (host_addr));
        host_addr.sin_family = AF_INET;
        host_addr.sin_port = htons (80);;
    	host_addr.sin_addr.s_addr = inet_addr (host);
    
        if (host_addr.sin_addr.s_addr == INADDR_NONE) {
            // Server wurde nicht mit IP sondern mit dem Namen angegeben
            hostinfo = gethostbyname (host);
            if (hostinfo == NULL) {
                printf("gethostbyname()");
                return;
            }
            memcpy((char*) &host_addr.sin_addr.s_addr, hostinfo->h_addr, hostinfo->h_length);
        }
    
    	//erneut verbinden
        if (connect(sock, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1) {
            printf("connect()");
            return;
        }
    
        // HTTP-GET-Befehl erzeugen
        sprintf (command, "GET /filmanzeige.php?filmid%s HTTP/1.1\r\nHost: %s\r\n\r\n", linkX, "filmdb.de");
    
        // Befehl senden
        bytes_sent = send (sock, command, strlen (command), 0);
        if (bytes_sent == -1) {
            printf("send()");
            return;
        }
    
        // Antwort des Servers empfangen und auswerten
    
    	// erstmal alles in ein File schreiben
    	G_la = fopen("OUT.film.txt","wb");
        while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) > 0) {
    
    		fwrite(buf, 1, bytes_recv, G_la);
    	}
        if (bytes_recv == -1) {
            fclose(G_la);
            printf( "recv()22");
            return;
        }
        fclose(G_la);
    
    	ende = GetTickCount();
    
    	printf("time4 = %i\n",ende-start);
    

    mfg und danke für eure hilfe



  • Mmh. Also im Code ist IMHO nichts, was irgendwie bremsen könnte. Daher tippe ich, dass die Serverantwort so lange dauert.

    Um das weiter zu analysieren rate ich dir in der while-Schleife, welche die Serverantwort in die Datei speichert, einfach mal alles auf der Konsole auszugeben was reinkommt. Dann siehst du ja, ob es daran vielleicht hängt.

    Und dazu die Zeitmessung nur um die while-Schleife legen. Und dann poste mal die Ergebnisse.



  • hast recht es is nur diese while schleife. Könnte die performance verbessert werden wenn man anstatt in ein file in einen buffer schreibt ?

    Ich glaube fast das liegt an meinem router ist allerdings seltsam das wenn ich die seite manuell ansurfe das ganze um einiges schneller geht.



  • c°h° schrieb:

    Könnte die performance verbessert werden wenn man anstatt in ein file in einen buffer schreibt ?

    Definitiv nicht 😉 Bei diesen Datenmengen (werden ja wohl nicht mehr als ein paar KB sein) merkst du die Plattenzugriffe gar nicht. Das spielt sich im Millisekundenbereich ab.



  • Ich vermute, dass der letzte recv-Aufruf, nachdem alles übertragen wurde, so lange dauert. Der wartet wohl darauf, dass die Gegenstelle die Verbindung schließt.

    Ich kenne das HTT-Protokoll nicht auswendig, aber sollte es nicht möglich sein, aus dem Header der Antwort zu entnehmen, wie viele Bytes du genau empfangen musst? Dann müsstest du darauf nicht warten.



  • Das ist der Header

    HTTP/1.1 200 OK
    Date: Mon, 17 Jul 2006 22:41:06 GMT
    Server: Apache/1.3.31 (Unix) PHP/4.3.8
    X-Powered-By: PHP/4.3.8
    Transfer-Encoding: chunked
    Content-Type: text/html
    

    leider lässt sich da nichts rauslesen.

    trotzdem Danke für die Idee 🙂



  • c°h° schrieb:

    Transfer-Encoding: chunked
    ...
    leider lässt sich da nichts rauslesen.

    Äh, rfc2616 3.6.1 beschreibt doch, wie das bei chunked ist...



  • ich würd die WinInet API benutzen. Das selbst zu implementieren ist ein bisschen aufwendig.


Anmelden zum Antworten