Scegli C ++ o Java per le applicazioni che richiedono enormi quantità di RAM? [chiuso]


11

Sto pensando ad applicazioni scientifiche che sono principalmente legate al processore e pesanti sull'uso dell'heap (almeno diversi gigabyte). In qualsiasi altro momento dell'anno andrei felicemente con C ++, ma in questo caso mi chiedo se la frammentazione naturale del gestore della memoria C ++ possa essere un problema serio rispetto al vantaggio dei collettori compattatori Java.

Qualcuno può indicare esempi del mondo reale correlati a questo?


Non penso che il linguaggio sia importante quanto la programmazione in questo caso. Qualsiasi linguaggio maturo potrebbe probabilmente funzionare a seconda della scala del tuo calcolo. Ci sono Javas, C / C ++, persino Pythons e Rubies che possono scivolare in questo ruolo. Alcuni sarebbero più difficili di altri in quanto sembra che tu abbia davvero bisogno di avere la certezza che non stai perdendo memoria.
Rig

2
Se riesci a ottenere un GB per $ 7,99, è un problema? Kingston 1GB DDR3
Bo Persson

2
@BoPersson, nella mia esperienza, le persone che hanno questo tipo di problemi iniziano popolando completamente la loro scheda madre di fascia alta e si lamentano che non possono inserirci quanto vogliono, quindi alimentano un set di dati grande quanto gestibile e poi si lamentano che non è abbastanza.
Programmatore

@dsign, in questi giorni in cui puoi ottenere la scheda madre che accetta diverse centinaia di concerti di memoria per meno di 1000 €, qualche concerto non è pesante nell'uso della memoria.
Programmatore

1
Concordo con la parte di memoria economica. Per quanto riguarda lo sviluppo, sono stato in C ++ per un po 'e le buone pratiche di codifica rendono le perdite un fenomeno piuttosto raro; in effetti, preferisco davvero il C ++ rispetto a Java in questo senso.
firma il

Risposte:


11

Se stai parlando di un'applicazione che è destinata a sottolineare i limiti della macchina, in modo che ti aspetti di fare trucchi di programmazione per evitare di superare tali limiti, allora C ++ è la strada da percorrere. Non solo C ++ offre spazio per l'ottimizzazione dove Java non (come sottolineato da Emilio), ma anche, Garbage-Collector è un aggeggio molto affamato di memoria che ha bisogno di molta memoria aggiuntiva per funzionare in modo efficiente.

Le risposte a questa domanda: StackOverflow: quanta memoria aggiuntiva richiede la garbage collection ? dipingi un quadro piuttosto cupo, ma anche se i garbage collector necessitano che la memoria libera sia pari a quella della memoria allocata (che è ciò che avevo sentito), ciò significa che con Java avrai ancora bisogno di molta memoria libera affinché funzioni in modo efficiente.

D'altra parte, oggigiorno preferiamo generalmente acquistare hardware più costoso piuttosto che dover eseguire trucchi di programmazione per evitare di superare i limiti dell'hardware. Nel tuo caso, i tuoi problemi di RAM verrebbero normalmente risolti usando una macchina a 64 bit e lanciando su di essa tutti i moduli RAM necessari. Vedete, il costo dell'hardware non è affatto vicino al costo dei tempi di sviluppo nel mondo sviluppato al giorno d'oggi.

Penso che dovresti considerare seriamente questa opzione e, se possibile, andare con questa opzione e con Java anziché C ++, perché è molto più facile sviluppare qualcosa in Java che in C ++ e continuare a mantenerlo in seguito.


Grazie per la tua risposta. Sono d'accordo con la tua illustrazione hardware.
firma il

Se non ti interessa la pausa del programma durante l'esecuzione della garbage collection, le esigenze di memoria sono molto più piccole.

1
Non sono d'accordo con l'ultimo paragrafo. Java non è necessariamente più facile da sviluppare rispetto al C ++. Non sarebbe per me, dato che ho fatto molto C ++ e relativamente poca Java negli ultimi cinque o sei anni. È possibile scrivere codice gestibile e non mantenibile sia in C ++ che in Java.
David Thornley,

1
@DavidThornley Ho fatto C / C ++ per 10+ anni e Java per 6+ anni. Trovo che Java sia più semplice sotto tutti gli aspetti: prototipazione, sviluppo, estensione e manutenzione. Ma in ogni caso, questo è ciò che le opinioni dovrebbero fare: differire . C -: =
Mike Nakis,

Qualcuno di voi ha programmato un progetto per i big data e affamato di processore? Qualche commento lì?
firma il

7

Il problema non è usare C ++ in quanto è Java e non usare Java in quanto è C ++. Un contenitore C ++ viene normalmente implementato per evitare l'eccesso di frammentazione, proprio come fa l'archivio gratuito Java.

Ma se ti assegni direttamente la memoria, puoi fare anche cose che Java non ti consente di fare, che può causare frammentazione.

La soluzione corretta (in C ++) è utilizzare container e smart-pointer tramite classi di allocatore che gestiscono l'allocazione mediante "plex" fissi (il punto chiave, qui, sta scrivendo una buona classe di allocatore). E questo è uno stile di programmazione che non ha nulla a che fare con Java, quindi ogni confronto non ha senso.

[EDIT] Questo può essere un campione obsoleto: allocazione fissa


Grazie per la tua risposta Emilio. Sono ben consapevole della flessibilità di C ++ e sono propenso a concordare con te. Inoltre, vorrei conoscere alcuni esempi di utilizzo del mondo reale in cui queste tecniche sono state utilizzate per il successo.
firma il

@dsign: Post modificato, vedere il link
Emilio Garavaglia,

1
Ho usato queste tecniche in precedenza. Un'app con prestazioni scadenti ha cambiato l'allocatore per utilizzare un set di heap a blocco fisso. Quindi, quando si voleva un blocco di 4 byte, proveniva dall'heap che memorizzava solo blocchi di 4 byte. Se volevi 5 byte, proveniva dall'heap di blocchi a 8 byte, ecc. L'aumento delle prestazioni (per la nostra app fortemente allocante) è stato eccezionale. Potresti non ottenere un risultato altrettanto buono, ma può essere molto efficace. C'è stata anche una frammentazione zero poiché tutti gli alloc sono arrivati ​​in blocchi fissi.
gbjbaanb,

2

Il vantaggio della garbage collection è che simula una macchina con una quantità infinita di memoria. Il meccanismo o l'implementazione di tale astrazione dovrebbe essere completamente trasparente per te come programmatore. Sappiamo tutti che il meccanismo sta recuperando la memoria che non è più utilizzata dal programma, ma in realtà non è garantita. Se si esegue il programma su una macchina con più RAM di quella che il programma effettivamente utilizza, la garbage collection potrebbe non avvenire mai. Ancora una volta, irrilevante, perché puoi semplicemente scrivere il programma indipendentemente da come usa la memoria. Il gestore della memoria assegnerà più RAM ogni volta che il programma lo richiede e si può presumere che tali allocazioni avranno sempre successo. Java è un linguaggio spazzatura e C ++ no. 1

Lo svantaggio della raccolta dei rifiuti è che, come tutte le astrazioni , tende a perdere. Non sempre funziona perfettamente tutto il tempo, in particolare nei casi limite, e probabilmente ti imbatterai in bug. Le persone che hanno scritto l'algoritmo di garbage collection (quello che dovrebbe essere trasparente per te come programmatore) ottimizzato per i casi più comuni, e il problema con i casi comuni è che non sono mai così comuni. In generale , non è possibile fare di meglio di Garbage Collector nella gestione della memoria. Ma in circostanze specifiche (e data una quantità sufficiente di tempo, energia e comprensione), potrebbe essere possibile. C ++ ti offre questa flessibilità; Java no.

Detto questo, penso che i consigli standard per la scelta di una lingua si applichino qui, forse ancora di più in questo caso, dati i vincoli. Scegli la lingua più familiare agli sviluppatori principali per il progetto. Oltre alle ovvie ragioni (come se sarai in grado di sviluppare l'app più velocemente e in modo più efficiente), questo è particolarmenteimportante nel caso in cui descrivi perché programmare C ++ come stai programmando Java si tradurrà in pratiche di gestione della memoria terribilmente inefficaci, e quindi perdite e arresti anomali. Analogamente, programmare in Java come se stessi programmando in C ++ non ti farà molto bene e potrebbe finire per produrre un programma poco ottimizzato, dato che gli algoritmi di Garbage Collection sono ottimizzati e ottimizzati per i casi più comuni .

I programmatori che sono abituati a lavorare in lingue raccolte di immondizia imparano a fidarsi del garbage collector, piuttosto che a lottare contro di esso. Se stai lavorando in un linguaggio spazzatura, questi sono i programmatori che desideri sul tuo progetto. Programmatori che non lo sonoabituati a lavorare in un linguaggio raccolto dall'immondizia sono intrinsecamente scettici nei confronti di un'astrazione di "memoria infinita" e spesso con molte buone ragioni. Per quanto buoni possano essere questi programmatori, questi non sono quelli che vorresti lavorare in un linguaggio spazzatura perché combatteranno contro il GC in ogni fase del percorso, indovinandolo costantemente in secondo luogo e spesso producendo più lento, meno efficiente in termini di memoria codice rispetto all'altro tipo di programmatore. Nella migliore delle ipotesi, passeranno solo un sacco di tempo a reinventare la ruota, costando un sacco di soldi e ancora di più in costi di manutenzione a lungo termine.

E poi devi anche chiederti se è davvero importante. C'è più di un pizzico di verità nel commento sdolcinato di Bo: la memoria è così economica adesso, non vale quasi la pena strizzare troppo la mano. Anche se hai bisogno di enormi quantità, tali importi non sono così massicci ora come lo erano 10 anni fa. I programmatori e lo sviluppo di applicazioni sono molto più costosi di un semplice acquisto di RAM e potenza di elaborazione. Ciò non significa che dovresti evitare l'economia dove possibile, ma significa che non dovresti perdere troppo tempo a farlo, neanche.


1 Naturalmente, questo presupposto evidenzia un difetto più profondo nella domanda. A quanto pare, "Java o C ++" è un po 'un'aringa rossa. L'implementazione standard di Java fornisce Garbage Collection e C ++ non è conforme allo standard linguistico, ma non c'è assolutamente alcun motivo per cui non è possibile utilizzare un Garbage Collector di terze parti per C ++. Molte aziende si sono guadagnate da vivere vendendo queste cose e alcune probabilmente si sono guadagnate da vivere regalandole gratuitamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.