Newsgroup: it.comp.lang.c++
Titolo: funzioni standard C++ e microistruzioni

Avrei necessità di sapere all'incirca quante microistruzioni (assembly)
eseguono le seguenti funzioni:
cout << "ciao";
cin >> var_tmp
a[n]=1 dove n è un numero intero fissato a priori.
grazie per l'aiuto
--
San Vegeta from Hell
http://www.geocities.com/Area51/Dungeon/8436
http://come.to/Fantasy.it

...


...

Io studio il C e il C++ nel tempo libero. Frequento il primo anno di
Informatica, e devo imparare il Pascal per l'esame di programmazione.
Siccome il prof. se n'è uscito con una sparata pazzesca (che secondo lui un
pentium 100 MHz, per eseguire un centinaio di milioni di istruzioni
assembler, ci metterebbe 35 giorni) io volevo fare una prova che si tenesse
sul vago per calcolare quanto tempo ci mette il mio PII 262 per allocare
10^8 celle di interi, riempirle, ordinarle e deallocarle.
Le microistruzioni (che poi non sono quelle che volevo conteggiare, ho
sbagliato termine) mi servivano per farmi un'idea dei passaggi che effettua
il PC a fare una determinata operazione. Non è per niente esatta una stima
del genere, ma è sicuramente minore di quella vera.

 a[n]=1 dove n è un numero intero fissato a priori.
Di solito una sola istruzione, pero' potrebbe anche prima mettere 1 in
un registro e poi copiarlo nell'array.  Se a e' un puntatore, potrebbe
caricare a in un registro, sommarci n, poi usare il risultato per accedere
all'array.
	Mauro

 10^8 celle di interi, riempirle, ordinarle e deallocarle.
Non si puo' fare una misura esatta, perche' il tempo necessario per
eseguire un'istruzione dipende del tipo di istruzione (su registri/memoria,
intera/floating-point, ...), e dall'ordine in cui si trovano.
Non ti conviene allocare memoria dinamica, perche' e' un'operazione
"pesante", ed e' praticamente impossibile sapere quante istruzioni
sono necessarie (bisognerebbe spulciare a fondo le librerie).
Anche ordinare le celle e' sconsigliabile: usa degli 'if', quindi non
si sa quante volte vengono eseguite le varie parti di codice.
Per una misure di questo tipo ti conviene fare un ciclo:
  for (int i = 0; i < MAX; ++i) {
    // varie operazioni, ma senza if/while/...
    // e senza chiamate a funzione.
    // puoi usare anche cose "pesanti", tipo floating point,
    // moltiplicazioni, divisioni, ...  tanto ci mette molto
    // meno di 35 giorni
  }
Chiedi al compilatore di generare l'assembler (di solito -S ), conti
le istruzioni generate, e regoli MAX (10^8 / istr)
	Mauro

 assembler, ci metterebbe 35 giorni)
Considerando che il mio vecchio Spectrum (Z80 a 3.5 MHz) ci metterebbe
meno di cinque minuti ad eseguire cento milioni di istruzioni da 10
T-States cadauna direi che il tuo prof. l'ha sparata davvero grossa...
EMG

si sa quante volte vengono eseguite le varie parti di codice.
Nella fretta e per l'ora tarda ho dimenticato di scrivere il codice per
riempire gli array in modo che fosse necessario un ordinamento totale.



Sto diventando OT, ma oggi ha fatto di peggio. Voleva dare delle formule di
Analisi Matematica (<<perchè io non mi fido degli altri...>>) e ha detto una
cavolata dietro l'altra.

[OT] Benvenuto all'università allora!!!!!
comunque sulla norton guide (asm.ng o simile) per l'assembler che puoi
trovare su ftp si trova, istruzione x istruzione, il numero di cicli di
clock richiesti... ma lo sforzo non mi pare valga la candela (tanto poi il
prof. HA SEMPRE RAGIONE [specialmente agli esami!!])
Quasi Ing. Lello Mele




Se usi il Visual C++ Microsoft per generare il codice assembler basta che
vai nel Project Settings scegli il tab C/C++ poi dalla combo box scegli
Listing Files e quindi nella combo denominata Listing File Type scegli se
generare un file col codice macchina, oppure con l'assembler. La migliore
opzione secondo me e' Assembly with Source Code (cosi' per ogni istruzione
C avrai il corrispondente codice assembler). Compili e avrai un file che ha
un suffisso tipo cod oppure asm, non ricordo, aprilo e vedrai quello che
cerchi. Spero ti sia stato di aiuto.