Mac chat


chest
 Share

Recommended Posts

Va bene... visto che nessuno ha risolto il mio problema, eccovi la mostruosità che ho prodotto nel tentativo di venirne a capo:

<FONT FACE="Courier New">#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <sys/time.h>

#include <sys/resource.h>

#define DEFAULT_N 10000000

#ifndef USE_CLOCK

    #define USE_CLOCK 1

#endif

#ifndef USE_RUSAGE

    #define USE_RUSAGE 1

#endif

int main (int argc, char *argv[])

{

    int m, n;

    int *v;

    float s;

#if USE_CLOCK

    clock_t cbegin, cend, ctime;

#endif

#if USE_RUSAGE

    struct rusage ru;

    struct timeval tv_ubegin, tv_uend, tv_utime, tv_sbegin, tv_send, tv_stime;

#endif

    if (argc == 2) {

        n = atoi (argv[1]);

    } else if (argc == 1) {

        n = DEFAULT_N;

    } else {

            fprintf(stderr, "Syntax: %s n\n", argv[0]);

            return 1;

    }

    m = n;

    v = malloc (sizeof(int) * n);

    

#if USE_CLOCK

    cbegin = clock();

#endif

#if USE_RUSAGE

    getrusage(RUSAGE_SELF, &ru);

    tv_ubegin = ru.ru_utime;

    tv_sbegin = ru.ru_stime;

#endif

    do {

     v[--m] = 0xDEADBEEF;

    } while (m);

#if USE_CLOCK

    cend = clock();

#endif

#if USE_RUSAGE

    getrusage(RUSAGE_SELF, &ru);

    tv_uend = ru.ru_utime;

    tv_send = ru.ru_stime;

#endif

    

#if USE_CLOCK

    ctime = cend - cbegin;

    s = (float)(ctime)/CLOCKS_PER_SEC;

    printf("clock: %.2f s (precision %.2f s)\n", s, (float)1/CLOCKS_PER_SEC);

    printf("clock: %f Mbit/s\n", (float)sizeof(int)*n*8/1024/1024/s);

    printf("clock: 32-bit bus frequency: %f MHz\n", (float)sizeof(int)*n/s/4000000);

    printf("clock: 64-bit bus frequency: %f MHz\n\n", (float)sizeof(int)*n/s/8000000);

#endif

#if USE_RUSAGE

    timersub(&tv_uend, &tv_ubegin, &tv_utime);

    timersub(&tv_send, &tv_sbegin, &tv_stime);

    s = (float)tv_utime.tv_sec+(float)tv_utime.tv_usec/1000000;

    printf("rusage: user: %.2f s   system: %.2f s\n", s, (float)tv_stime.tv_sec+(float)tv_stime.tv_usec/1000000);

    printf("rusage: %f Mbit/s\n", (float)sizeof(int)*n*8/1024/1024/s);

    printf("rusage: 32-bit bus frequency: %f MHz\n", (float)sizeof(int)*n/s/4000000);

    printf("rusage: 64-bit bus frequency: %f MHz\n\n", (float)sizeof(int)*n/s/8000000);

#endif

    return 0;

}</FONT>

Link to comment
Share on other sites

  • Replies 22.6k
  • Created
  • Last Reply

Top Posters In This Topic

Ed ecco i risultati su un iBook G3 900 MHz, bus 100 MHz, OS X 10.2:

<FONT FACE="Courier New">[iBook:~/Projects/Chest] camillo% gcc dead.c -o dead

[iBook:~/Projects/Chest] camillo% time ./dead

clock: 0.28 s (precision 0.01 s)

clock: 1089.913452 Mbit/s

clock: 32-bit bus frequency: 35.714283 MHz

clock: 64-bit bus frequency: 17.857141 MHz

rusage: user: 0.28 s system: 0.00 s

rusage: 1089.913452 Mbit/s

rusage: 32-bit bus frequency: 35.714283 MHz

rusage: 64-bit bus frequency: 17.857141 MHz

0.070u 0.240s 0:00.36 86.1% 0+0k 0+0io 0pf+0w</FONT>

Notate come le misure ottenute con getrusage siano completamente diverse da quelle fornite da time (che, teoricamente, usa lo stesso metodo). :/

Su OS X, potete disabilitare l'utilizzo di clock(), tanto i valori sono gli stessi dello user time di getrusage() (giustamente).

Compilate con <FONT FACE="Courier New">gcc -DUSE_CLOCK=0 dead.c -o dead</FONT>

Su Linux, lasciate clock() attivo, i risultati sono diversi. :/

Link to comment
Share on other sites

Siccome mi ero stancato di leggere dei listati orrendamente mutilati da Discus, ho fatto un piccolo script per risolvere il problema:

<FONT FACE="Courier New">on replace_string(this_text, search_string, replacement_string)

    set saved_delimiters to AppleScript's text item delimiters

    set AppleScript's text item delimiters to the search_string

    set the item_list to every text item of this_text

    set AppleScript's text item delimiters to the replacement_string

    set this_text to the item_list as string

    set AppleScript's text item delimiters to saved_delimiters

    return this_text

end replace_string

on discus_encode of message given preformatting:preformat

    if preformat then

        set message to replace_string(message, "    ", "    ") -- tab -> 4 spaces

        set message to replace_string(message, " ", " ") -- space -> non-breaking space (alt+space)

    end if

    set message to replace_string(message, "{", "\{")

    set message to replace_string(message, "}", "\}")

    return message

end discus_encode

on run

    set encoded_message to "\fixed{" & (discus_encode of (the clipboard) with preformatting) & "}"

    set the clipboard to encoded_message

end run</FONT>

L'ho salvato nella mia cartella ~/Library/Scripts con il nome "Encode Source in Clipboard". Quando voglio postare un programma, copio il testo, eseguo lo script, e incollo nel messaggio che sto scrivendo. Usatelo anche voi.

Link to comment
Share on other sites

Questo è il risultato sul mio Al (10.3.3): direi che il tempo di clock() corrisponde al tempo di user + sys.

Anche il tempo di time sembra congruente (c'è un po' più

di sys, ma può essere dovuto alle printf finali non conteggiate).

Al:~/tmp zann$ time ./dead

clock: 0.22 s (precision 0.01 s)

clock: 1387.162598 Mbit/s

clock: 32-bit bus frequency: 45.454544 MHz

clock: 64-bit bus frequency: 22.727272 MHz

rusage: user: 0.10 s system: 0.12 s

rusage: 3051.757812 Mbit/s

rusage: 32-bit bus frequency: 100.000000 MHz

rusage: 64-bit bus frequency: 50.000000 MHz

real 0m0.651s

user 0m0.100s

sys 0m0.140s

Link to comment
Share on other sites

<FONT COLOR="ff0000">40 MB allocati staticamente... brrr!</FONT>

Tzk, che fastidio ti danno? Vengono rilasciati con il programma, esattamente come quelli della tua malloc >__<

Link to comment
Share on other sites

Zann: <FONT COLOR="aa00aa">Questo è il risultato sul mio Al (10.3.3): direi che il tempo di clock() corrisponde al tempo di user + sys.

Anche il tempo di time sembra congruente (c'è un po' più

di sys, ma può essere dovuto alle printf finali non conteggiate).</FONT>

Oh, si vede che è cambiato qualcosa da 10.2 a 10.3. Panther si comporta come Linux.

Sarebbe interessante vedere i risultati su un iBook G3 900 con Panther...

Comunque, a parte i dati (che sono sempre bene accetti!), ci vorrebbe qualche interpretazione di questi dati. I miei dubbi li ho espressi qualche messaggio fa...

Camillo: <FONT COLOR="0077aa">40 MB allocati staticamente... brrr!</FONT>

Zann: <FONT COLOR="aa00aa">Tzk, che fastidio ti danno? Vengono rilasciati con il programma, esattamente come quelli della tua malloc >__<</FONT>

Faccio un po' il Sephiroth della situazione... con malloc puoi sempre usare free; con l'allocazione statica non ci fai niente. Metti che tu voglia riutilizzare il programma come sottoroutine di un programma più grosso (che so, la suite di test ChestMark 2004): se allochi nello heap nessun problema, se fai l'allocazione statica ti becchi i 40 mega fissi dall'inizio alla fine del programma. Quindi, meglio abituarsi a non abusare dell'allocazione statica! ^_^

Link to comment
Share on other sites

<FONT COLOR="ff0000">Quindi, meglio abituarsi a non abusare dell'allocazione statica! ^_^</FONT>

Sei libero di pensarla in questo modo. In un programma di due righe faccio l'Occam della situazione e privilegio la semplicità ;)

Comunque, compilando con -O (e ripetendo il fill a deadbeef per 100 volte, altrimenti i risultati sono troppo ballerini) ho questo risultato:

rusage: 64-bit bus frequency: 102.880646 MHz

molto simile a quello misurato con memset e non troppo lontano dai 167MHz del bus del mio Al.

Link to comment
Share on other sites

chest><FONT COLOR="ff0000">Voi capite che se Apple dice che 1 e 2 hanno frequenza di 1Ghz, è lecito attendersi che i dati vadano da 4 ad 1 e 2 in 1 nanosecondo, altrimenti il bus che fa, piroetta su se stesso a velocità fenomenale mentre il controller si fa le pippe??? Oddio, magari è così, cerchiamo di scoprirlo. </FONT><FONT COLOR="000000">

non sono un genio della fisica, anzi, ma non significa che viene spedito un impulso, cioè se l' ampiezza fosse 32 bit, vengono spediti 1 miliardo di volte al secondo. poi magari per raggiungere la memoria gli ci vuole 1 ora, ma intanto sono tutti belli allineati e formano un flusso. no?</FONT>

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share