Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    211

    [c++]Prestazioni auto e register

    Sto provando le prestazioni di auto e register ma non ci sono riuscito, credo perchè c++ 2005 utilizza delle ottimizzazioni interne che risolvono questo genere di for:

    //Prende il tempo attuale
    long start=time(NULL);

    long len=10000000000000000000;
    auto int a=2;
    for(long a1=0;a1<len;a1++)
    for(long a2=0;a2<len;a2++)
    for(long a3=0;a3<len;a3++)
    for(long a4=0;a4<len;a4++)
    for(long a5=0;a5<len;a5++)
    for(long a6=0;a6<len;a6++)
    for(long a7=0;a7<len;a7++)
    for(long a8=0;a8<len;a8++)
    for(long a9=0;a9<len;a9++)
    for(long a10=0;a10<len;a10++)
    for(long a11=0;a11<len;a11++)
    for(long a12=0;a12<len;a12++)
    {
    a+=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12;
    }

    cout<<a<<"Tempo auto:"<<time(NULL)- start<<"\n";

    start=time(NULL);
    register long b=1;
    for(register long a1=0;a1<len;a1++)
    for(register long a2=0;a2<len;a2++)
    for(register long a3=0;a3<len;a3++)
    for(register long a4=0;a4<len;a4++)
    for(register long a5=0;a5<len;a5++)
    for(register long a6=0;a6<len;a6++)
    for(register long a7=0;a7<len;a7++)
    for(register long a8=0;a8<len;a8++)
    for(register long a9=0;a9<len;a9++)
    for(register long a10=0;a10<len;a10++)
    for(register long a11=0;a11<len;a11++)
    for(register long a12=0;a12<len;a12++)
    {
    b+=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12;
    }

    cout<<b<<"Tempo register:"<<time(NULL)- start;
    Qualcuno, lo utilizza register per velocizzare delle operazioni?

  2. #2
    "register" è solo un suggerimento al compilatore di ottimizzare le variabili in questione, teoricamente inserendole nei registri della CPU; poi il compilatore (specialmente se le variabili che segnali sono tante) è libero di fare quello che vuole.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Praticamente, a meno che tu non escluda completamente le ottimizzazioni, il compilatore, quando può, utilizza comunque preferibilmente i registri della CPU ...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    211
    Ok...Quindi diciamo che avviene tutto in automatico....
    Ma volevo chiedere anche un 'altra cosa: nel codice che ho postato ho fatto eseguire più cicli uno interno all'altro. Il fatto è che il programma viene sempre eseguito in meno di 1 secondo. E possibile o il linguaggio applica un metodo per risolvere i cicli?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Questo perche' ci sono degli errori. Nella riga

    long len=10000000000000000000;

    assegni alla variabile long un valore molto piu' ampio di quello massimo consentito e il compilatore 'tronca' in maniera errata generando (addirittura) un valore negativo ...
    I cicli, ovviamente, non saranno eseguiti.

    Deve essere

    unsigned __int64 len=10000000000000000000;

    Naturalmente lo stesso discorso vale per *tutte* le variabili contatore usate nei for e per il totalizzatore a.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    211
    Da dove viene fuori quel
    unsigned __int64 ?
    Non si puo' fare con:
    unsigned long?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Sai calcolare qual e' il valore massimo che puo' essere espresso con un unsigned long?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    211
    Si...unsigned long = 8 byte =32bits= 2^32 valori.
    Pero' volevo sapere da dove viene fuori __int64? Ha lo stesso identico significato di long?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Cesaropa12
    Si...unsigned long = 8 byte =32bits= 2^32 valori.
    Pero' volevo sapere da dove viene fuori __int64? Ha lo stesso identico significato di long?
    __int64 e' un tipo di dato intero a 64 bit utilizzabile in Visual C/C++.

    Ovviamente, essendo il long a 32 bit, non e' la stessa cosa ...

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    211
    Cavolo...Ma io ho scritto
    8 byte=32 bit e ho sbagliato perchè 8 byte =64 bit.
    Quindi __int64 è esattamente la stessa cosa di long. Penso pero' che a seconda dell'implementazione della macchina long possa essere 4 o 8 byte, al che __int64 è sempre 8 byte.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.