Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [java] CPU (troppo) impegnata...

    Il mio programma, sempre quello delle simulazioni del lotto...

    Quando eseguo la simulazione, che sia breve o lunga piu' di un minuto, la finestra del programma non viene piu' aggiornata. Anche le altre applicazioni soffrono un po', ma la finestra della mia applicazioncina viene completamente trascurata.

    Ho provato ad inglobare il codice CPU-bound in un thread separato che faccio partire quando l'utente lo richiede, mentre il thread padre attende e si risveglia ad intervalli di 100ms per aggiornare la ProgressBar... Niente... Stessa identica cosa...

    Ho messo il file JAR sul mio sito, se qualche volenteroso volesse fare da cavia e dirmi se ha i miei stessi problemi...

    dist.zip

    In basso c'e' il campo dove specificare quante estrazioni simulare. Col valore di default, il programma esegue per ben 30 secondi (il JAR un po' di piu', arriva anche a 42...) sul mio AMD a 2GHz

  2. #2
    Giusto per specificare...
    La versione attuale del programma, avendoci ricamato molto sopra, consta di piu' di venti classi.

    La prima era un applet di un centinaio di righe che faceva la stessa identica cosa, e presentava lo stesso identico problema.

  3. #3
    Ho sostituito la parte algoritmica con un bel sleep(50)...
    Nessun cambiamento...
    Ma tutte a me capitano?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Così senza vedere la parte di codice incriminata è un po' difficile, comunque la maggior parte delle volte un consumo di CPU troppo alto si verifica quando ci sono loop stretti, specialmente strutture di questo tipo:
    codice:
    while (condizione);
    o simili, con istruzioni veloci all'interno di while o for...

    In genere, quando si ha a che fare con strutture di questo tipo, si tende a indirizzarci verso i Thread, utilizzando, specialmente, i metodi di sincronizzazione, ove possibile.

    Ad esempio: se c'è una computazione che richiede l'attesa di un evento (calcolato o manuale), attraverso un controllo di tipo while, è bene sostituirlo con delle strutture di sincronizzazione facendo uso della parola chiave sinchronized e del metodo wait().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    sul mio pentium III 933 mhz, 128 mb ram(più della metà in uso) e jvm 1.5.1, il valore di default lo fa in qualche frazione di secondo senza incastrarsi.

    Dopo parecchie esecuzioni si incastra anche a me.

    Un problema simile l'ho avuto quando ho dovuto fare una progress bar per mostrare il processo di codifica di un file, in quel caso ho usato i metodi stop, resume & c.o pur essendo deprecati, obsoleti, bacati ecc...

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  6. #6
    Frazione di secondo?!?!?!??!?

    Cmq il problema si ripete anche se il thread principale fa un ciclo di wait e quello secondario un ciclo di sleep.
    E ovviamente ce l'avevo anche quando non chiamavo alcun thread...

    Anzi, sono tentato di dire che la parte algoritmica, per quanto pesante, non abbia alcun ruolo: se infatti tolgo il wait, il thread principale va avanti a stampare i risultati (sbagliati) senza alcun problema...

    Cerchero' di postare una versione minimale che riproduce il problema...

  7. #7
    Il programma principale com'era un mese fa:

    Lotto.java

    ho eliminato la JProgressBar, fatto qualche piccola modifica, ma il problema sussiste.
    L'ho modificato in modo da usare una versione semplificata della classe Ruota che ho chiamato:
    RuotaFinta.java

    Da cui ho estrapolato la funzione di output. Per i piu' volenterosi, qui c'e' la classe completa:

    Ruota.java

    I calcoli vengono eseguiti nel metodo generaEstrazione() di Ruota/RuotaFinta.

  8. #8

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Il problema risiede proprio nel fatto che hai un carico computazionale molto alto. Osserva cosa fai nella classe Lotto.java:
    codice:
    public void generaTutto(int ripetizioni) {
       for (int a=0;a<ripetizioni;a++)
          libera.generaEstrazione();
    }
    Per ciascuna iterazione richiami 6 metodi (all'interno della classe Ruota / RuotaFinta) i quali eseguono, ciascuno, una serie di cicli for (da un minimo di 5 iterazioni ad un massimo di 90, da quel che ho letto).

    Ora, se ripetizioni è impostato al valore iniziale di 10000000, prova a pensare a quante operazioni richiedi di eseguire...

    Questa parte, che è la più onerosa, la devi spostare all'interno di un Thread, ridefinendo il metodo run() e richiamandola utilizzando il metodo start().


    PS: questa dichiarazione è molto divertente
    codice:
    public class Ruota extends Object {
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    La dichiarazione l'ho dovuta fare per forza, non so perche', problemi di NetBeans suppongo. Ora funziona anche senza...

    Stasera provo a rispostare tutto in un thread usando questa versione semplice. Cmq quando l'ho fatto non e' cambiato nulla. Anche togliendo quelle 6 chiamate e sostituendolo con sleep.

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.