View Full Version : [c#] numero istruzioni eseguite
omniaforever
14-02-2010, 21:40
ragazzi, in un progetto in visual studio in C# è possibile farsi stampare il numero di istruzioni eseguite per l'esecuzione dell'intero algoritmo
grazie
il-pollo
15-02-2010, 10:32
a compile-time sarebbe possibile solo se avessi codice privo di while
in generale è un calcolo eseguibile solo a run-time e dubito che il debugger di Visual Studio fornisca questa funzionalità
sei costretto ad aggiungere a mano un contatore che aumenta dopo ogni istruzione... un pò pallosa come cosa, ma niente di mistico ;)
tomminno
15-02-2010, 10:35
a compile-time sarebbe possibile solo se avessi codice privo di while
in generale è un calcolo eseguibile solo a run-time e dubito che il debugger di Visual Studio fornisca questa funzionalità
sei costretto ad aggiungere a mano un contatore che aumenta dopo ogni istruzione... un pò pallosa come cosa, ma niente di mistico ;)
Sempre che non intenda il numero di istruzioni IL, o peggio ancora istruzioni assembly.
il-pollo
15-02-2010, 10:48
Sempre che non intenda il numero di istruzioni IL, o peggio ancora istruzioni assembly.
già, quello sarebbe ostico
googleando (http://stackoverflow.com/questions/1375901/counting-machine-instructions-of-a-process-using-ptracesinglestep) ho sentito parlare di PTRACE_SINGLESTEP per contare il n° di istruzioni assembly dei programmi C
forse c'è qualcosa di analogo anche per C#
prima di impazzire nella ricerca di queste alternative, aspetto di sapere cosa intende veramente omniaforever :D
omniaforever
15-02-2010, 12:03
Sempre che non intenda il numero di istruzioni IL, o peggio ancora istruzioni assembly.
andando al sodo, mi serve calcolare la complessità computazionale dell'algoritmo, che varia al variare dei differenti dati che dò in ingresso (nel mio caso immagini che devo processare...per ogni immagine che processo devo stampare un file che tra le varie informazioni mi dà anche la complessità computazionale)
alcune idee a riguardo?
per calcolare la complessità computazionale valutare il numero di istruzioni elementari non so se sia fattibile sinceramente, in alternativa potresti (ad esempio) valutare il consumo RAM /procio e fare una media tramiteil namespace System.Diagnostic
omniaforever
15-02-2010, 13:06
grazie, potrebbe essere una soluzione...ma mi faresti un semplicissimo esempio d'uso?
altre idee, anche basate sul tempo?(avevo pensato di calcolare il tempo da quanto inizia l'algoritmo e quando finisce, ma non so se ha molto senso per la complessità computazionale)... anche l'idea del PTRACE_SINGLESTEP potrebbe essere carina
Beh in teoria per calcolarti il costo computazionale non dovresti appoggiarti ad alcuna implementazione.
E del resto il numero di istruzioni di per se non è indicativo.
Ad esempio:
- sorgente Python: 1 riga
- sorgente Java: 6 righe
- bytecode Java: 30 righe
- assembly: 90 righe
D'altronde potresti avere situazioni in cui:
- sorgente Python: 3 righe
- sorgente Java: 5 righe
- bytecode Java: 20 righe
- assembly: 70 righe.
(numeri casuali ovviamente)
In ogni caso nessuna di queste informazioni ti dice quanto sia efficiente il codice, anche perché bisogna vedere quale tipo di istruzioni andrà eseguito e come saranno eseguite dal processore.
Certo supponendo che ogni istruzione pesi uguale allora si potrebbe fare un discorso del genere.
Secondo me quello che ti conviene fare è misurare direttamente il tempo di computazione al variare dell'input (con un paio di timer ad inizio ed a fine funzione o dove ti interessa effettivamente), sulla stessa piattaforma ovviamente.
Ci sarebbe anche la possibilità del Profiling credo...
il-pollo
15-02-2010, 15:37
Beh in teoria per calcolarti il costo computazionale non dovresti appoggiarti ad alcuna implementazione.
superquoto ;)
se non sei alle prese con algoritmi ricorsivi o con implementazioni/strutture dati particolarmente complesse, dovrebbe essere facile trovare gli elementi teorici sufficienti per calcolare il costo computazionale asintotico
Secondo me quello che ti conviene fare è misurare direttamente il tempo di computazione al variare dell'input (con un paio di timer ad inizio ed a fine funzione o dove ti interessa effettivamente), sulla stessa piattaforma ovviamente.
riquoto
se usi dei metodi complessi o semplicemente dei quali non conosci l'implementazione, sei costretto a passare per la strada dei timer
l'unica pecca è che devi avere computazioni particolarmente pesanti (almeno qualche decina di secondi) per ottenere una stima significativa del costo dell'algoritmo
omniaforever
15-02-2010, 18:43
quindi potrei mettere banalmente un timer all'inizio del processo di una immagine, un altro timer alla fine del suo processamento , farmi la differenza dei tempi e in questo modo avrò il costo computazionale, giusto?
si in effetti la strada del timer come detto da WarDuck è più semplice di quella che ti avevo detto :)
Se sei in windows form puoi usare la classe Timer dove puoi fare come hai detto, scorri i pochi metodi con l'intellisense e vedi subito come si può fare:)
quindi potrei mettere banalmente un timer all'inizio del processo di una immagine, un altro timer alla fine del suo processamento , farmi la differenza dei tempi e in questo modo avrò il costo computazionale, giusto?
Usando i timer vedrai semplicemente quanto ci mette la tua macchina a processare quel dato input con quell'algoritmo.
Ovviamente se hai modo di discriminare l'input e raccogliere molti campioni potresti fare una stima del costo computazionale dell'algoritmo (che ti ricordo è una cosa generica ed indipendente dalla macchina su cui gira, poiché dipende solo dall'input e dalla bontà dell'algoritmo).
il-pollo
15-02-2010, 19:20
quindi potrei mettere banalmente un timer all'inizio del processo di una immagine, un altro timer alla fine del suo processamento , farmi la differenza dei tempi e in questo modo avrò il costo computazionale, giusto?
esatto
per ricavare i millisecondi attuali, puoi usare questo metodo che equivale al comodissimo omonimo Java:
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long CurrentTimeMillis(){
return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
omniaforever
15-02-2010, 19:41
grazie a tutti
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.