Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    13

    [java] numero di istruzioni e memory usage

    Ciao a tutti!
    volevo chiedere un aiuto a chiunque fosse in grado di darmelo.

    In pratica sto facendo un'applicazione java ed ora mi si presenta la necessità di:
    1. Contare il numero di istruzioni totali eseguite
    2. Ottenere, a fine esecuzione, l'utilizzo massimo di memoria della mia applicazione

    Il tutto dovrei farlo con gli strumenti offerti da java, senza utlizzare tools esterni.
    Qualcuno ha qualche idea?

    grazie mille.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123

    Re: [java] numero di istruzioni e memory usage

    Originariamente inviato da nero983
    Ciao a tutti!
    volevo chiedere un aiuto a chiunque fosse in grado di darmelo.

    In pratica sto facendo un'applicazione java ed ora mi si presenta la necessità di:
    1. Contare il numero di istruzioni totali eseguite
    2. Ottenere, a fine esecuzione, l'utilizzo massimo di memoria della mia applicazione

    Il tutto dovrei farlo con gli strumenti offerti da java, senza utlizzare tools esterni.
    Qualcuno ha qualche idea?

    grazie mille.
    La classe class penso faccia al caso tuo:
    http://download.oracle.com/javase/6/...ang/Class.html

    Puoi ottenere un elenco dei metodi, modificatori, variabili,...

    E Runtime per info sulla memoria utilizzata e libera..
    http://download.oracle.com/javase/6/...g/Runtime.html

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    13
    Per il ottenre la memoria utlizzata ho usato la classe Runtime, in questo modo:

    codice:
    long used = runtime.totalMemory()-runtime.freeMemory();
    a mio parere però, in questo modo si conosce l'utilizzo di memoria nel momento in cui si effettua la chiamata e non il massimo utlizzo durante tutta l'esecuzione dell'applicazione.

    Per quanto riguarda il numero totale di istruzioni eseguite, in che modo la classe Class può essermi utile?

    Attualmente sto utlizzando questa tecnica:

    codice:
    long start = System.nanoTime();
    
    /* codice dell'applicazione.... */
    
    long elapsed = System.nanoTime()-start
    in questo modo ricavo il tempo trascorso in nanosecondi ( in maniera molto precisa) e da li riesco a ricavare il numero di cicli della CPU.
    Ma questo tempo trascorso (oltre a non darmi un numero di istruzioni effettuate) non tiene conto solo dell'applicazione che voglio monitorare, ma è influenzato dalle altre applicazioni che girano nello stesso momento sulla CPU. Quindi diciamo che non è un misura molto affidabile per effettuare delle comparazioni con altre applicazioni o con varie esecuzioni della stessa applicazione.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java] numero di istruzioni e memory usage

    Originariamente inviato da nero983
    1. Contare il numero di istruzioni totali eseguite
    No, anche perché dovresti precisare cosa intendi per "istruzioni" ... il che sarebbe "vago".

    Originariamente inviato da nero983
    in questo modo ricavo il tempo trascorso in nanosecondi ( in maniera molto precisa) e da li riesco a ricavare il numero di cicli della CPU.
    Appunto sono "nanosecondi", una unità di misura ben precisa .... non centra nulla con le istruzioni eseguite o con la frequenza del processore o altro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    13
    In che senso dovrei specificare meglio cosa intendo per numero di istruzioni? Numero di istruzioni java. Ma anche numero di istruzioni macchina andrebbe bene... Mi serve come unità di misura per poter effettuare dei confronti con una versione precedente dell'applicazione.

    Appunto sono "nanosecondi", una unità di misura ben precisa .... non centra nulla con le istruzioni eseguite o con la frequenza del processore o altro.
    Si, ma non è una misura indipendente. Cioè se eseguo per due volte la stessa applicazione potrei avere dei valori in nanosecondi differenti. Io invece avrei bisogno di una misurazione più statica...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ma hai chiara la differenza tra numeri di istruzioni in un linguaggio ad alto livello e numero di istruzioni macchina?
    Oltretutto per java dovresti fare un po di giri, perché parti dal programma, passi dalla jvm che esegue sulla macchina locale.

    Inoltre tutto dipende dal carico che hai: hai solo java in esecuzione o hai altro? banalmente, consideri anche il tempo che passi per fare swap da un processo all'altro?
    Considera architettura processore, memoria a disposizione...un'analisi statica di certo non viene fatta con un programma scritto in java!!!(a livello di istruzioni macchina)

    Se vuoi contare il numero di istruzioni eseguite...beh non so fino a che punto è possibile (e se esistono programmi che lo fanno), banalmente in genere si fa una media dei tempi di esecuzione a massimo carico (almeno io faccio così)

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    13
    Originariamente inviato da valia
    ma hai chiara la differenza tra numeri di istruzioni in un linguaggio ad alto livello e numero di istruzioni macchina?
    Oltretutto per java dovresti fare un po di giri, perché parti dal programma, passi dalla jvm che esegue sulla macchina locale.
    Ho ben chiara la differenza. Ma a me serve un idicatore di confronto! Se questo è il numero di istruzioni java o il numero di istruzioni macchina non mi importa! l'importante è che si usi lo stesso indicatore sulle varie versioni dell'applicazione che voglio confrontare...

    Inoltre tutto dipende dal carico che hai: hai solo java in esecuzione o hai altro? banalmente, consideri anche il tempo che passi per fare swap da un processo all'altro?
    Per questo io dicevo che una misurazione in nanosecondi non è affidabile, perche non tiene conto di tutto questo...

    Fino ad ora ho fatto anche io la media dei tempi elapsed, per poi fare dei confronti su questi tempi. Ma purtroppo mi sono stati richiesti questi indicatori....Anzi ne approfitto...avresti qualche dritta sul punto due del mio primo post? Cioè ottenere il picco di utilizzo di memoria dell'applicazione?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Anche per l'utilizzo massimo di memoria vale la stessa considerazione: devi sapere quanta ne hai a disposizione, quanta ne allochi solo per il processo java (jvm), quanta di questa allocata se ne utilizza dal tuo programma.
    Ti chiedevo della differenza tra istruzioni macchina e istruzioni normali perché per le prime parli di assembler per le seconde banalmente parli di una riga di codice, il risultato non è la stessa cosa (un if o un salto possono equivalere a 10 cicli di clock persi e memoria sprecata che nel tuo caso equivale a 10 possibili istruzioni non eseguite).
    Poi se il confronto devi farlo con programmi nativi (es scritti in C), a meno che non scrivi baggianate, questi saranno sempre più veloci (non si passa dalla jvm per quanto possa essere efficiente). Un confronto vero ci sarebbe con programmi scritti in linguaggi che passano da un qualche framework (es c#), ma le prestazioni di un programma in C/C++ scritto bene non le raggiungi con java.
    Del resto non ci siamo mai posti questi problemi comparativi sapendo cmq che i numeri forniti sono medie di valori ottenuti prendendo certe macchine e operando in certe condizioni

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    13
    Originariamente inviato da valia
    Anche per l'utilizzo massimo di memoria vale la stessa considerazione: devi sapere quanta ne hai a disposizione, quanta ne allochi solo per il processo java (jvm), quanta di questa allocata se ne utilizza dal tuo programma.
    Infatti con questo codice provo a fare proprio questo:
    codice:
    long used = runtime.totalMemory()-runtime.freeMemory();
    Il totalMemory mi dà il totale allocato alla JVM (che è inferiore alla memoria disponibile) e togliendo il freeMemory ottengo la memoria attualmente utilizzata. Ma in questo modo non riuscirò mai a conoscere il picco di utilizzo...

    Originariamente inviato da valia
    Ti chiedevo della differenza tra istruzioni macchina e istruzioni normali perché per le prime parli di assembler per le seconde banalmente parli di una riga di codice, il risultato non è la stessa cosa (un if o un salto possono equivalere a 10 cicli di clock persi e memoria sprecata che nel tuo caso equivale a 10 possibili istruzioni non eseguite).
    Poi se il confronto devi farlo con programmi nativi (es scritti in C), a meno che non scrivi baggianate, questi saranno sempre più veloci (non si passa dalla jvm per quanto possa essere efficiente). Un confronto vero ci sarebbe con programmi scritti in linguaggi che passano da un qualche framework (es c#), ma le prestazioni di un programma in C/C++ scritto bene non le raggiungi con java.
    Purtroppo l'applicazione è scritta in Java (e l'applicazione con cui voglio fare i confronti è anche essa scritta in Java) , e fare una migrazione a linguaggi tipo C/C++ non è una cosa fattibile..

    Originariamente inviato da valia
    Del resto non ci siamo mai posti questi problemi comparativi sapendo cmq che i numeri forniti sono medie di valori ottenuti prendendo certe macchine e operando in certe condizioni
    Quindi in definitiva credi che non siano delle misurazioni reallizzabili in un qualisiasi modo?
    Grazie.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    con i metodi che hai visto, ma ripeto una vera analisi vorrebbe una macchina dedicata, con SO ridotto al minimo in modo da vedere effettivamente quanto pesa il tutto

    Puoi provare con strumenti di profiling, ma ripeto il carico che ha la macchina al momento dell'esecuzione influisce sui result (quindi tanti test e tante medie)

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 © 2025 vBulletin Solutions, Inc. All rights reserved.