Newsgroup: it.comp.java
Titolo: Utilizzo stack e performance

Ciao a tutti, vorrei chiedere un'opinione. Ho una funzione con questa 
signature:
public void send(long, long, int, Long, Long, String, int, String, 
String, String[], int, long, MyObject);
che, quando richiamata, a sua volta, prima di arrivare ad effettuare 
delle operazioni "concrete" richiama a cascata altre 3 funzioni passando 
praticamente gli stessi parametri di cui sopra (forse c'� una lieve 
differenza, ma di poco conto).
Secondo voi, se anzich� passare tutta questa sfilza di parametri, 
costruisco un mio oggetto (o una Hashtable, o altro che funga da 
"contenitore" per tutti questi valori) e poi passo solamente questo 
singolo oggetto, quanto potrei risparmiare in termini di stack 
utilizzato, utilizzo di cpu (rimozione di un sacco di push/pop) e 
performance del sistema? Ovviamente se necessario (come nel caso della 
Hashtable) i tipi primitivi verrebbero trasformati nei corrispettivi 
Wrapper e utilizzerei pi� memoria, e mi stavo chiedendo appunto se 
otterrei dei benefici con una modifica tipo quella descritta sopra o � 
una perdita di tempo...
Purtroppo sto "ereditando" un progetto gi� esistente ed � da migliorare 
come performance, fare dei test veloci al volo non risulterebbe troppo 
significativo come risultati, per questo devo affidarmi alle sensazioni!
Grazie mille per eventuali risposte :)
-- 
"Grazie, re, per aver accettato di lasciarti vincere soltanto dai tuoi 
soldati"
Veterano di fanteria ad Alessandro Magno, rive del fiume Ifasi, 326 a.C.

 utilizzato, utilizzo di cpu (rimozione di un sacco di push/pop) e 
Secondo me poco. Non stiamo mica parlando di CPU anni 80... e poi 
hotspot dove lo metti? Per ottimizzare devi usare un qualche tool 
apposito, altrimenti perdi solo tempo. Chiaro che se ci sono cose 
evidenti (loop inutili, connessioni lasciate aperte e altre amenit�) ci 
puoi arrivare anche a occhio, ma altrimenti ti consiglio vivamente l'uso 
di un profiler.
-- 
bye
DKano


Come ti ha risposto DKano probabilmente non guadagneresti nulla in
termini di performance (anzi, forse perderesti qualcosa :-)). Ma ci
guadagneresti sicuramente in termini di leggibilità: vuoi mettere send
(objectToSend) con send(int, int, long, String, blah, blah, blah)? Io
creerei subito un oggetto contenitore e darei un nome significativo a
tutta quella sfilza di variabili.
Ma è un punto "critico" per il tuo programma o è una piccola mania da
perfezionista (non voglio essere offensivo, capitano anche a me ogni
tanto :-))?
Ciao!

 Ciao!
Diciamo un po' e un po' :P Un po' � perch� � brutto vedere tutta quella 
roba passata come parametro, diventa appunto illeggibile...un po' perch� 
non mi piace quando vedo sprechi di risorse inutili o il classico 
"spaghetti code" perch� tanto "abbiamo tanta ram, processori veloci, 
chissenefrega della memoria" e poi ci sono operazioni da 5 secondi che 
impiegano minuti ad essere eseguiti proprio perch� si programma con i 
piedi (e, ahim�, non � cosa cos� rara da vedere), e nonostante siano 
anni che programmo in java, mi � capitato anche di scrivere firmware, 
per cui ho sviluppato una certa propensione all'ottimizzazione :P 
Infine, � anche un punto piuttosto critico, perch� il sistema richiede 
delle performance non indifferenti e invia molti dati al giorno (si 
parla di cifre come 500 mila mms al giorno), e quel punto � proprio dove 
inizia l'invio del messaggio...
Purtroppo a me tocca l'ingrato compito di velocizzare tutto ci� che c'� 
perch� attualmente andiamo pi� lenti di quanto previsto dalle specifiche 
(che vorrebbero idealmente un throughput di quasi 2 milioni di 
mms/giorno, anche se poi magari ne inviano solo 1), per cui sono alla 
ricerca di tutti i punti sensibili che fanno diventare il tutto 
pachidermico... :'(
Grazie mille per i consigli, magari la modifica la far� comunque proprio 
per la leggibilit�! ;)


 pachidermico... :'(
Credere di migilorare il throughput di una simile applicazione agendo
su ottimizzazioni del tipo che hai presentato tu, è pura follia oltre
che perdita di tempo.
Rinnovo il consiglio di altri: misura i tempi attuali (JMeter?),
individua i colli di bottiglia del tuo codice (con VisualVM?) e solo
dopo comincia ad ottimizzare. Poi rimisuri (usando lo stesso identico
test) con JMeter. E avanti cosi'.

 On 27 Mag, 11:29, Elvandar <gas_NOSPAMma...@yahooTOGLIMI.it> wrote:
[CUT]
Hai/avete pensato anche di centrare gli obiettivi di performance
semplicemente distribuendo l'applicazione su macchine diverse (sempre
che sia possibile)?


E' gi� su macchine diverse, in produzione lavora su un cluster sun 
composto di 2 macchine, ognuna con cpu quad core e 8 gb di ram, jboss 
4.2.2 e oracle 10g.
Purtroppo un collo di bottiglia enorme che ho trovato � l'utilizzo di 
JMS, che � ottimo per lo scambio di messaggi, ma pachidermico nel nostro 
caso, quindi vedr� se e come sostituirlo...anche perch� avendo appena 
iniziato a lavorare su questo progetto non ho ancora la visibilit� 
completa della bestia che �, anche riuscire a capire dove e come 
intervenire mi viene difficile ora come ora...
Per ora grazie mille a tutti per le risposte :)
PS: purtroppo non sei il primo che mi dice che ho idee folli, gi� il mio 
capo mi ha detto pi� volte che se c'� un modo semplice e uno complicato 
per fare una cosa, io scelgo sempre l'ultimo...anche se poi tutto 
funziona! :D Insomma, semplificarmi la vita non � il mio forte!


 funziona! :D Insomma, semplificarmi la vita non è il mio forte!
Beh ma non si parlava di semplice o complesso, semplicemente di non 
perdere tempo in ottimizzazioni inutili.

 caso, quindi vedr� se e come sostituirlo...anche perch� avendo appena 
E lo usate per fare cosa? Magari ti si pu� dare qualche consiglio
  --
bye
DKano