|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
[JAVA] Quando le prestazioni contano
Salve a tutti, ho una questione da risolvere.
Sto partendo con un progetto piuttosto serio in cui si necessita di ALTE PRESTAZIONI e mi è stato detto che esiste la possibilità di compilare Java in modo che non generi bytecode ma codice nativo che viene eseguito senza interpreti intermedi. Volevo sapere innanzitutto se questa cosa è possibile (guardando in giro pare di si) e soprattutto se produce vantaggi PRATICI? Considerate che l'applicativo in questione potrebbe dover girare anche svariate ore (è un simulatore) quindi le prestazioni non servono al boot ma nell'esecuzione a regime. Lo scrivo chiaramente in modo che non nascano eventuali flame: IO VORREI USARE JAVA perchè lo conosco abbastanza bene e so che sarei più produttivo. Detto ciò, se la situazione dovesse essere inaccettabile dal punto di vista delle performances, dovrò desistere e andare all'alternativa (che può essere _esclusivamente_ C++ quindi non ci sono altre strade). Mi farebbe piacere sentire i pareri di gente che ha più esperienza di me perchè chiaramente se si parla di ordini di grandezza di differenza la scelta è obbligata ma se Java si può spingere a livelli comparabili, si potrebbe accettare un tradeoff... Grazie in anticipo
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Beh, java non usa più interpreti da secoli... e puoi compilare il tuo codice, ma non puoi compilare tutta la libreria e il runtime
Senza contare che la "lentezza" di Java risiede in altro, tipo nel garbage collector, nel thrashing allegro dell'heap che fa la libreria standard, nell'allocazione ancora più allegra di nuovi oggetti, nella mancanza di overloaded operators ed inline, etc. Per cui, credo che compilare il codice non sia un grande aiuto alle prestazioni. Ma comunque queste sono speculazioni, l'unico modo per essere sicuri è TESTARE Scrivi qualcosa di rappresentativo del tuo carico di lavoro in C++, Java e Java compilato, e vedi come va! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Concordo. Esiste gcj per compilare java in codice nativo, ma dubito che possa fare meglio della VM 7 e annesso HotSpot.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Grazie per le risposte. Alla fine dei conti immaginavo che non poteva essere un compilatore a risolvermi i problemi..
Questa potrebbe essere una buona idea, a patto che riesca a fare un prototipo molto semplificato in poco tempo... Il core di tutto il sw è un simulatore a eventi discreti. Fare delle prove anche solo per capire quali sono le differenze potrebbe portare via parecchio tempo (purtroppo sono poco familiare con C++).
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2001
Città: Cernobbio -Co-
Messaggi: 47
|
Ti è possibile pensare di rendere il simulatore multithread per sfruttare davvero al 100% la cpu?
__________________
micheledellatorre.net |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Profiling, profiling, profiling
Dopo che avrai capito dov'è realmente il collo di bottiglia nel tuo codice, si potrà pensare a come sistemarlo
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
La natura del mio problema si presta in modo naturale ad un approccio ad oggetti oltrechè alla parallelizzazione visto che ci sono N dispositivi da simulare simultaneamente (sono dei router ma non basati su IP). Il multithreading sarà d'obbligo. Mi sa che si potrebbero fare dei test incrociati come consigliato da alcuni di voi, poi dall'alto sceglieranno cosa è meglio!
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Gcj è un binario morto. Lo sviluppo è fermo da anni a java 1.4 con ancora parti della libraria da implementare e quello che c'è è bugnato. Lascia perdere questi aggeggi se hai intenzione di usare java. La jvm è più che sufficiente per arrivare a sfiorare le prestazioni di un programma scritto in C.
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 07-05-2012 alle 11:46. |
||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Vero, mi pare anche che c'era un modo per "convincere" la JVM a compilare tutti i metodi al primo utilizzo... però non so qual'è. Magari non esiste
![]() EDIT: un articolo molto interessante con dei veri tests: http://caprazzi.net/posts/jit-compiler-part-1/ Ultima modifica di Tommo : 07-05-2012 alle 13:23. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Direi che con -XX:CompileThreshold=1 dovrebbe andare... mai fatto dei test in questo senso però.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Riuppo questo thread di qualche mese fa per chiedervi nuovi consigli...
Il mio software è praticamente finito, gira su Win7 64 bit + Java 7 (per sviluppare utilizzo Eclipse). Volevo chiedervi qualche tool per fare un pò di profiling in maniera semplice e veloce. Mi interessa sia analizzare le performances in termini di CPU che in termini di memoria e dovrei farlo in _poco_ tempo...
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Parti con visualvm. Se hai installato il jdk lo hai già bello e pronto sul disco.
|
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Quote:
Dai report prodotti da visualvm emerge che c'è un'allocazione massiccia di byte[] (svariate centinaia di MB), cosa che io non faccio mai esplicitamente nel mio codice, non ho alcun array di byte. Immagino che sia memoria allocata internamente da Java: è possibile risalire fino a CHI causa questa allocazione?
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
|
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Rieccomi qui.
Diciamo che da un punto di vista dei tempi di esecuzione ho ottimizzato quel che c'era da ottimizzare... Il problema adesso è l'occupazione di memoria! Il mio programma parte con un buon ritmo, ad un certo punto raggiunge quota 2GB (visibile anche dal Task Manager) e lì comincia a rallentare vistosamente. Tra l'altro non capisco se rallenta perchè arriva ad un punto della simulazione molto oneroso oppure perchè il GC è troppo indaffarato a liberare memoria. Comunque sia, tramite il profiler scopro che buona parte della memoria è occupata da oggetti di tipo 'Event' (classe mia) e la cosa è anche normale visto che è un simulatore a eventi discreti ne vengono allocati molti. Viste queste grosse esigenze di allocazione potete consigliarmi qualche tecnica per risparmiare memoria e/o gestirla in maniera più efficente? Ho già minimizzato il numero di new cercando di riusare gli oggetti. Adesso mi balenava l'idea di fare uno store di oggetti di questo tipo così quando ne ho bisogno li chiedo sempre allo store che li allocherà fisicamente solo quando c'è realmente bisogno. Ovviamente si complica un pò tutto perchè quando sti oggetti non servono più devo tenerne traccia e rilasciarli nello store per renderli disponibili al successivo bisogno... Avete idee??
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Comunque, circa l'object pool, potresti leggere qualcosa in merito: in linea di massima in Java non è una buona stategia. - http://stackoverflow.com/questions/3...n-java#3657724 - http://stackoverflow.com/questions/6...object-pooling Prova a spulciare tra questi topic, potresti trovare validi suggerimenti per il tuo caso; male che vada potrai schiarirti un po' le idee: + http://stackoverflow.com/questions/t...es&pagesize=15
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Quote:
La maggior parte sembrano sconsigliare il pooling tanto dicono che gli oggetti, Java li crea a "basso costo"... Sarà ma se di oggetti ne servono migliaia e migliaia al secondo non mi pare trascurabile la questione della creazione/deallocazione (soprattutto deallocazione)... Aggiungo che ulteriori analisi col profiler dimostrano che ad un certo punto tutto rallenta perchè la CPU è quasi totalmente utilizzata dal GC (ho utilizzato il tracer di visualvm), come immaginavo...
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ah, un'altra cosa: probabilmente non è il tuo caso ma occhio ai memory leak fantasma causati dai profiler birboni; se puoi è meglio "profilare" l'applicazione da remoto.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:04.





















