Speicher lesen/schreiben, Benchmark



  • Mahlzeit!

    Ich wollte mal so aus Spass einen Speicherbenchmark programmieren. So wie beispielsweise bei den Programmen Aida32 oder SiSoft Sandra. Jetzt stelle ich
    aber fest das das gar nicht so einfach ist. Wo soll ich nur anfangen ? 😕 Wie messen die den Durchsatz pro Sekunde beim Schreiben und Lesen des Arbeitsspeichers ? Habt ihr mal einen Programm-Technischen Ansatz der mir auf die Sprünge helfen könnte ? 🙂



  • #include <iostream>
    #include <time.h> 
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    time_t a, b;
    double *d = 0; //
    
    time(&a);
    
    for(unsigned int i = 0; i < 65535; ++i)
    {
        d = new char;
        delete d;
    }
    
    time(&b);
    
    cout << "you can swap " << 65535 * sizeof(double) << " bytes in ";
    cout << (a - b) / 1000 << " seonds.\n";
    
    return 0;
    }
    

    so zum beispiel? oder testet das mehr die cpu-leistung?

    mfg



  • bufferoverlow-user schrieb:

    so zum beispiel? oder testet das mehr die cpu-leistung?

    das wird nicht viel machen...

    wohl eher per memcpy massenweise Speicher umkopieren - aber da gibt es viele Aspekte die mitspielen...



  • Ich würd das in Assembler schreiben. Da weißt du genau, was du tust. Kein Compiler pfuscht dir durch vorgenommene oder unterlassene Optimierungen ins Messergebnis rein.



  • Shade Of Mine schrieb:

    bufferoverlow-user schrieb:

    so zum beispiel? oder testet das mehr die cpu-leistung?

    das wird nicht viel machen...

    wohl eher per memcpy massenweise Speicher umkopieren - aber da gibt es viele Aspekte die mitspielen...

    na gut. einen versuch war es wert 🙂

    mfg



  • Ok, jetzt bin ich allerdings etwas verwirrt:
    Denn wie misst man jetzt Lese- und Schreib-Durchsatz ? 😕
    Es ist doch so: Wenn ich einen Speicherbereich kopiere, z.B mit memcpy dann passiert folgendes: Der Speicher wird gelesen und der Inhalt an eine andere Stelle geschrieben.
    Also: Wir haben automatisch einen Lese/Schreib Zugriff. 😃
    Aber wie um alles in der Welt, schreibt man ein Programm das nur liest oder nur schreibt.
    Das ist IMHO überhaupt nicht möglich, oder seh ich das jetzt falsch ? 😕



  • Cpp_Junky schrieb:

    Also: Wir haben automatisch einen Lese/Schreib Zugriff. 😃
    Aber wie um alles in der Welt, schreibt man ein Programm das nur liest oder nur schreibt.
    Das ist IMHO überhaupt nicht möglich, oder seh ich das jetzt falsch ? 😕

    Natürlich ist das möglich. Bei AMD Prozessoren kann man zB mit einem 'prefetch' des Speichers ordentlich Speed rausholen 🙂

    Man liest dann einfach nur den Speicher:
    for(int i=0; i<size; ++i) *p++;

    Man muss lediglich darauf achten, dass der Compiler es nicht weg optimiert - da die Schleife ja eigentlich nix macht. Allerdings wird dadurch der Speicher gelesen - und landet im cache.

    Jetzt kann man schön schnell schreiben:
    reset(p);
    for(int i=0; i<size; ++i) *a++=*p++;

    Da jetzt eben nur nach a geschrieben wird und aus dem cache gelesen.

    Nun ist dir wohl auch klar wie man nur schreibtests durchführen kann:
    for(int i=0; i<size; ++i) *p++='x';

    Aber: das ganze hängt eben von vielen Faktoren ab - wie mein prefetch Beispiel zeigt. Wenn die Daten aus dem cache gelesen werden - dann ists enorm viel schneller - da es eben nur write Zugriff gibt und keinen read Zugriff.

    So einfach ist so ein Test also nicht durchzuführen. Ich habe mit zwar noch nie mit Intel Prozessoren beschäftigt - aber die werden das ähnlich machen wie AMD 🙂

    Lies dir einfach mal die Dokumente auf amd.com und intel.com durch - da gibts einige interessante Artikel.



  • Kann mir jemand sagen, ob

    Shade Of Mine schrieb:

    for(int i=0; i<size; ++i) *p++;

    =

    while( *p++ ) ;
    

    und

    Shade Of Mine schrieb:

    for(int i=0; i<size; ++i) *a++=*p++;

    =

    while( *a++ = *p++ ) ;
    

    und

    Shade Of Mine schrieb:

    for(int i=0; i<size; ++i) *p++='x';

    =

    while( *p++ = 'x' ) ;
    

    ist? Habe da noch leichte Probleme.
    MfG Stentor



  • Nein.

    Mit meinem for durchlaufe ich eben exakt size Elemente.

    Die while Schleifen (bis auf die letzte) laufen bis zum Ende eines stringes (0 Zeichen).

    Die letzte läuft ewig.

    Mit dem size wollte ich zeigen, dass man zB für einen benchmark 100000 Elemente nimmt 🙂 dann ist size 100000.


Anmelden zum Antworten