|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
[Java] Uso della memoria, prestazioni, vs c++
Volevo un po' di pareri riguardo alle prestazioni di Java soprattutto su come utilizza la memoria e in misura minore la cpu, in particolare in relazione ad uno stesso ipotetico programma scritto in c++, a parità di algoritmi e con una programmazione orientata in maniera massiccia all'ottimizzazione.
Per l'ambito, diciamo un programma per calcolo scientifico, assetato in maniera incredibile di ram, no calcoli in virgola mobile, no grafica, no I/O; il calcolo richiede molta potenza alla cpu, ma non ci sono vincoli di tempo (no real time, se finisce qualche min. prima o dopo nessun problema. Se finisce 2 giorni dopo sì Da una parte si sente sempre: "Java è pesante.", "Il programma X scritto in Java è lento", ecc. D'altra parte ho letto che: Java è nato per sistemi embedded, dove l'hardware è limitato; l'ottimizzazione del jvm è notevole e a volte può competere con la gestione della memoria lasciata al programmatore. Lato cpu, Jit e ancora una volta la jvm si danno parecchio da fare. Sembra insomma che Java non sia ordini di grandezza più lento del c++. Ovviamente dipende da ciò che si vuole fare nel caso specifico. Leggendo un altro thread un grosso limite di Java è la casualità con cui interviene il garbage collector. Non si può usarlo quindi per programmi con stringenti vincoli di tempo. Ci sono altri problemi simili? Inoltre vorrei sapere se: in generale è sconsigliato usare Java per software dove anche l'ultimo bit è importante? Perché? Un oggetto Java "spreca" della memoria oltre ai dati dichiarati dal programmatore? (Riguardo ciò, da una ricerca su internet fatta un po' di tempo fa, ho scoperto sorprendentemente che non si può sapere quanto occupa un oggetto se non con metodi poco ortodossi, tipo allocare 1000 oggetti e vedere quanto sale la ram occupata Grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
UP.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
IMVHO:
E' vero che da una parte il linguaggio Java non consente l'ottimizzazione del codice che un programmatore C/C++ molto esperto sarebbe in grado di estrarre implementando lo stesso algoritmo in quel linguaggio su di una piattaforma che conosce molto bene, ma considera che: 1) Di questi programmatori ce n'è proprio pochi: la maggior parte degli sviluppatori preferisce la comodità di un ambiente managed e non ha la capacità / il tempo / la voglia di tenere presente tutti i problemi aggiuntivi che sviluppare software unmanaged ti da', problemi che scegliendo Java (ma, per correttezza, anche C#, Ruby, Python, etc) non si hanno. E bada bene che non si possono eliminare dalla programmazione C/C++ queste caratteristiche, perchè proprio la sua capacità di "basso livello" da una parte aumenta le possibili ottimizzazioni, dall'altra impedisce l'uso di automatismi da piattaforma managed, appunto. 2) Bisogna fare un bilancio che tenga conto del tempo di sviluppo impiegato: siamo sicuri che il tempo speso per ottimizzare quattro loop annidati risparmiando dieci cicli di CPU non sarebbe stato meglio speso ottimizzando il funzionamento del'algoritmo ad alto livello? (Nota che in C/C++ puoi fare entrambe le cose, ma evidentemente mentre fai l'una non puoi fare l'altra...). 3) Il codice ultraottimizzato è meno leggibile e meno manutebile di quello più astratto, perchè il primo si allontana dall'intuizione umana più del secondo. 4) Esistono ottime librerie già esistenti a cui delegare i calcoli più complessi e che possono beneficiare in maniera significativa anche delle più piccole ottimizzazioni: queste sono scritte in C/C++ e probabilmente resteranno sempre così, perchè potranno essere riutilizzate a piacere da programmi scritti in altri linguaggi (i driver per i dispositivi sono scritti in C, ma ne beneficia tutto il S.O. e tutti gli applicativi che ci girano sopra, siano essi scritti in Java, .NET, Python, Ruby, ...). 5) L'hardware "costa poco": un incremento prestazionale del 5% si può ottenere aumentando i Mhz del processore con una spesa che magari è inferiore a quella del tempo di un team per ottimizzare in maniera estrema del codice. Al di là di queste considerazioni "personali", posso dire di aver avuto l'impressione che in ambito di ricerca accademica capiti spesso che venga usato il linguaggio Java anche per simulazioni e calcoli dove le prestazioni sono importanti, senza particolari lamentele.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Il vantaggio dei linguaggi managed, risiede nella libreria che mettono immediatamente a disposizione dello sviluppatore, non tanto nella mancanza della gestione diretta della memoria (in quanto nei linguaggi managed devi gestirti a mano la "deallocazione" di oggetti che usano risorse non gestite es connessioni db, tcp, file...).
Prova ad aprire connessioni magari al database centrale dell'azienda e ad aspettare che sia il GC a chiuderle, il server comincia a segnalare che ci sono troppe connessioni nel giro di pochi minuti, fermando il lavoro di tutta l'azienda. Il fatto che siano lenti (e lo sono anche parecchio in confronto al C++, al lavoro è una situazione che vedo praticamente tutti i giorni) non interessa quanto l'uniformità della piattaforma di sviluppo. E l'hardware non costa affatto poco. Un computer assemblato a mano costa poco, prova a sentire quanto costa un server rack e magari visto che stiamo parlando di elevati volumi di traffico magari 2 con un bilanciatore e mettici pure un NAS dietro per tutti i dati. Ecco questo è il livello minimo di hardware, in più conta le licenze... |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Mar 2007
Messaggi: 298
|
Java non mi sembra particolarmente lento. Ha senz'altro alcuni problemi di performance (il GC, il fatto che i programmi vengono impacchettati in archivi zip, richiedendo una fase di scompattamento prima dell'esecuzione, etc.), ma niente di terribile.
Tutti i programmi impongono un trade-off tra flessibilità e potenza: Java è stato pensato per essere meno complicato di C++, ed in cambio paga un prezzo in performance. Lo stesso si dica di qualsiasi altro programma che "semplifica" la programmazione (in media, maggiore è l'astrazione dal linguaggio macchina, maggiore è la penalità in termini di performance). Anche C++ è meno performante di C... L'importante dunque è scegliere il linguaggio giusto per ogni compito: se devi ottimizzare al massimo, meglio se usi C++ o persino C (di rado in un programma di calcolo hai bisogno delle estensioni object oriented di C++, hanno un costo in performance pure quelle). Se invece qualche perdita di velocità è accettabile, pur di avere una programmazione più semplice e meno complicata, ben venga Java o C#, o Python... E' vero che un server enterprise è costoso, ma costa di più mantenere un codice più complesso: il costo di assumere 4-5 programmatori per un anno supera di gran lunga il costo di un server di prima categoria. Inoltre, Java è ricco di codice evoluto open source che altrimenti bisognerebbe sviluppare in-house o acquisire in costose librerie... infatti, Java è molto comune in ambiti aziendali per questi motivi. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Volevo proprio capire quanto sia possibile avvantaggiarsi degli aspetti positivi di un linguaggio come Java da voi menzionati nel caso del tipo di software del mio primo thread.
Perché ancora non ho ben compreso quali sono le problematiche che portano a dire a tomminno: "Il fatto che siano lenti (e lo sono anche parecchio in confronto al C++" e nello stesso tempo a incipit1970: "Java non mi sembra particolarmente lento. Ha senz'altro alcuni problemi di performance ..., ma niente di terribile." Ho capito che il GC non si sa quando va in esecuzione (anche se lo si può chiamare forzatamente). Ma per il resto, soprattutto sull'uso della memoria? Grazie ancora. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
|
|
|
|
|
|
|
#8 | ||||
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
Quote:
Quote:
Rinunceresti alla SAN con i canali in fibra? No, perchè non è per la velocità di esecuzione che l'hai presa verosimilmente. Rinunceresti agli switch di rete ridondati? No, perchè non è per la velocità di esecuzione che ne hai ordinati due. Forse, diciamo, potresti evitare di comprare uno dei quattro server che stanno dietro al tuo load balancer (al quale non puoi rinunciare, per i motivi di cui sopra): il risparmio si ridurrebbe perciò ad un paio di migliaia di euro. Però in cambio dovresti rinunciare a tutti i benefici di una piattaforma managed... Intendiamoci, io non sono un grande esperto di questo genere di questioni, riporto solo le mie impressioni personali, che derivano da un po' di esperienza e da un po' di sentito dire, però non mi sentirei di dire, a tutt'oggi, che sia meglio intraprendere uno sviluppo su di un sistema unmanaged piuttosto che uno managed, nella maggioranza dei casi. Tornando poi al caso esposto da Johnn, forse farebbe premio la maggiore "riusabilità" del codice managed (specie se scritto secondo i criteri dell'OO, ma se si parla di Java, C#, Ruby, Python, ...) rispetto alle maggiori performance di quello funzionale, perchè ritengo (ma è solo una sensazione) che la perdita di performance, anche se ci fosse, sarebbe comunque una percentuale poco significativa dell'esecuzione del totale. E siccome non si tratta di compiti rt, ne deduco che, per esempio, aspettare 31 giorni per un risultato anzichè 30 non farebbe molta differenza. Quote:
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
||||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Poi puntualmente trovi metodi Dispose chiamati male, perchè tanto c'è il GC, nessuno ha mai imparato a gestire la memoria e quindi la deallocazione corretta delle risorse, nessuno si prende la briga di studiare lo using... |
|
|
|
|
|
|
#10 | |||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Sia all'avvio sia durante l'esecuzione, ho come esempio NetBeans che ci mette 40 secondi ad avviarsi e spesso si ferma a pensare quando devi aprire un menu o altro. Ma la mia esperienza con Java è disastrosa su tutti i computer che ho potuto provare, contrariamente a quello che riportano altri. Probabilmente quello che per me è inaccettabile come prestazioni per altri risulta adeguato. Quote:
Ad esempio se devi fare un'applicazione enterprise, non c'è C# che tenga, Java ha strumenti molto migliori ed è quindi più produttivo. Al contrario per lo sviluppo di un applicativo desktop, il vantaggio del linguaggio si fa sentire. Quote:
Certo se l'ottica è di incrementare il numero di server ogni anno al posto del numero di sviluppatori, chi se ne frega. |
|||
|
|
|
|
|
#11 | ||||||||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Per la mia esperienza trovo sempre colleghi che non hanno mai studiato il C/C++ che non usano correttamente la deallocazione delle risorse anche in linguaggi managed e questo a volte causa più danni di un memory leak in un singolo applicativo, tipo saturazione delle connessioni al db. Quote:
Quote:
A nessuno interessa la velocità di esecuzione. Quote:
Quote:
Comunque ormai i linguaggi managed sono lo standard aziendale, perchè sono stati creati strumenti intorno che li rendono intrinsecamente migliori. Quote:
Quote:
Solo che a volte rimani scottato come con .NET 1.1 il cui ambiente di sviluppo non è più supportato in Vista e gli applicativi sono non importabili nei nuovi ambienti. Quote:
|
||||||||
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Il garbage collector serve per la gestione della memoria, non delle risorse. Usarlo anche per quest'ultimo e' di solito un errore indotto da cattive librerie di sistema o da un linguaggio mal progettato. Molti linguaggi di alto livello supportano un uso corretto delle risorse (Ruby, Python, CL etc.)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#15 | |||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#16 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
![]() ovviamente inutile dire che sono l'unico fortunello a cui i menu di NetBeans si aprono al click e che di certo non ho un Core2Duo ben carrozzato edit - sapete indicarmi uno di quei programmi per registrare un video di ciò che accade sullo schermo? vorrei prendere un video dell'apertura di un menu di uno di quei programmoni Java belli grassi e grossi, tipo Eclipse e NetBeans, così poi ve lo faccio vedere
|
||
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
In C# forse nessuno se è il caso di usare lo using. Però una volta che qualcuno ti passa un riferimento potresti fare il Dispose nel momento sbagliato esattamente come la delete
|
|
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
Quote:
__________________
Khelidan |
||
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
http://www.microsoft.com/windows/win...screencap.aspx |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:58.




















