Newsgroup: it.comp.lang.c
Titolo: info BenchMark

Credete che un programma realizzato in c per testare "la velocità" della cpu
in determinate situazioni, come per esempio nello svolgimento di numerose
iterazioni, oppure con l'ordinamento di vettori grossi o ancora con
l'esecuzione di algoritmi un po' onerosi possa essere attendibile ?
io pensavo di implementarlo in questo modo
acquisisco tempo1 (magari con le funzioni della libreria time.h)
svolgo algoritmi iterazioni ecc
acquisisco tempo 2
il punteggio scaturirebbe dalla differenza tempo2-tempo1 oppurtunamente
elaborata (ad esempio facendo uscire da una differenza piu bassa un
punteggio piu alto e viceversa, come è logico che sia).
pensate che una soluzione del genere sia possibile ?
grazie in anticipo
roby


E' la tipica soluzione che si adotta, solo che in generale non interessa 
dare un punteggio, si mantiene solo il tempo dato come risultato.
Per misure piu' accurate o interessanti, di solito si usa un profiler, 
quindi un programma specializzato nel fare questo genere di misurazioni.
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 wrote

Se la tua domanda e': "e' possibile fare cio'?" la mia risposta e' si.
Se la tua domanda e': "i risultati sono attendibili?" la mia risposta e' non
proprio, o meglio, i risultati sono anche attendibili, ma solo per avere una
idea di quanto sia veloce un computer a far girare il *tuo* benchmark.
Questo non significa che il computer A che piu' veloce a girare il tuo
programma del computer B non sia pero' piu' lento di B a girare molti altri
software....
Per fare un benchmark (quasi accurato)  dovresti usare quasi tutte le
istruzioni di una architettura. Inoltre dovresti usarle in modo che
rispecchi la realta (presa da statistiche). Ovvero se le tue statistiche
indicano che il 30% di un eseguibile e' fatto da MOV registro->registro e un
1% da SSE2 ed un 4% da MMX e un 8% da XOR etc... il tuo programma dovra'
essere costituito in tale modo. Questo vale anche per densita'/cach-memory,
etc....
In pratica alla fine crei un programma (benchmark) che rispecchia l'uso
reale di tale architettura. Se ora A batte B e' probabile che, *in media* A
batta B anche in applicazioni reali.
Alternativamente puoi fare un benchmark specifico, ovvero puoi farlo solo
per applicazioni matematiche... ora prendi le statistiche solo da questo
tipo di applicazioni. Alternativamente da applicazioni 3D (vedi 3D Mark)
etc... queste infatti, ad esempio, non usano iterazioni e copiare array e
fare un bubblesort... prendono invece statistiche da videogiochi e programmi
3d (o per lo meno dovrebbero farlo) e poi creano un programma benchmakr che
rispetti tali statistiche.
Ad ogni modo se vuoi fare quello che descrivi per divertimento puoi
certamente farlo, a grosse linee i risultati saranno quelli che ti aspetti.
Scusa se sono stato  impreciso, ho scritto molto in fretta, ma spero di
averti fatto capire l'idea...
Tommy

 --
Grazie, Mattia.
Ora vorrei chiederti se esiste nelle librerie standard qualcosa di piu
preciso delle funzioni contenute della time.h, con le quali sono riuscito ad
ottenere una precisione solo a livello di secondo (e non, almeno, a livello
di 1/100 di secondo, cosa che vorrei).
Grazie !
Roby

 di 1/100 di secondo, cosa che vorrei).
Purtroppo la risoluzione minima delle funzioni di <time.h> non e` 
garantita dallo standard ma e` dipendente dall'implementazione. Hai 
provato con clock()?
     7.23.2.1 The clock function
     Synopsis
         #include <time.h>
         clock_t clock(void);
     Description
     The clock function determines the processor time used.
     Returns
     The clock function returns the implementation’s best approximation
     to the processor time used by the program since the beginning of an
     implementation-defined era related only to the program invocation.
     To determine the time in seconds, the value returned by the clock
     function should be divided by the value of the macro CLOCKS_PER_SEC.
     If the processor time used is not available or its value cannot be
     represented, the function returns the value (clock_t)-1.
-- 
Enrico `Trippo' Porreca

 Grazie !
Devi affidarti al sistema operativo, quindi non piu' al C standard e non
piu' portabile....
Su windows ad esempio GetTickCount() e' un tantino meglio di qanto offra
time.h, arriva ai  millisecondi.
Molto meglio su windows sarebbe usare High-resolution timers, ce ne sono
alcuni, vedi msdn.
Per rimanere "portabili", si potrebbe usare l'high resolution counter di
qualche libreria di cui sono stati fatti parecchi port...
Tommy

 Tommy
[CUT]
Grazie Tommy, sei stato chiarissimo. Mi rendo conto che un programma scritto
in Assembly basato sulle statistiche a cui ti riferisci sarebbe molto piu'
attendibile, purtroppo la mia conoscenza di questo linguaggio non è così
approfondita da permettermi di implementare una soluzione del genere.
Cerchero' comunque di convertire ogni istruzione C in istruzioni assembly in
modo da essere quanto piu fedele alle statistiche. Il problema è che non so
dove reperirle ste statistiche, anche se sono quasi certo che da qualche
parte sulla rete ci siano (so ad esempio che cè una legge empirica che dice
che per il 90 % dell'esecuzione un programma esegue poche istruzioni).
qualsiasi info a riguardo voi possiate darmi sarebbe apprezzata.
grazie, Roby

 che per il 90 % dell'esecuzione un programma esegue poche istruzioni).
le statistiche sono parte del progetto di realizzazione di un benchmark...
non esistono *le statistiche*, ma piuttosto le TUE statistiche. Piu' buone
sono le tue statistiche piu' accurato sara' (per quello scopo) il tuo
benchmark.
Quanto alla realizzazione non sei necessariamente costretto ad utilizzare
assembly, per lo meno non per tutto il tuo programma ;-) L'assembly viene
prodotto dal tuo compilatore e ... se il suo lavoro ti va bene ti accontenti
di quello che produce lui ;-) (dove non e' soddisfacente allora intervieni)
Detto questo ho finito i consigli da darti... non e' il mio campo, non sono
un esperto in materia.
Tommy