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

11

Sto pensando ad applicazioni scientifiche che sono per lo più legate al processore e pesanti nell'utilizzo dell'heap (almeno diversi gigabyte). In qualsiasi altro momento dell'anno sarei felice di andare con il C ++, ma in questo caso mi chiedo se la frammentazione naturale del gestore di memoria C ++ possa essere un problema serio rispetto al vantaggio dei compattatori di compattazione di Java.

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

    
posta dsign 14.01.2012 - 09:45
fonte

3 risposte

11

Se stai parlando di un'applicazione che è destinata a stress i limiti della macchina, in modo tale che ti aspetti che farai trucchi di programmazione per evitare di superare questi limiti, allora il C ++ è il modo di partire. Non solo C ++ ti dà spazio per l'ottimizzazione dove Java non lo fa, (come Emilio ha sottolineato), ma anche Garbage-Collectors sono molto affamati di memoria che necessitano di molta memoria extra per funzionare in modo efficiente.

Le risposte a questa domanda: StackOverflow: quanta memoria extra fa la garbage collection richiede ? dipingi un'immagine piuttosto cupa, ma anche se i garbage collector hanno bisogno che la memoria libera sia solo circa tanto quanto la memoria allocata (che è ciò che ho sentito), ciò significa comunque che con Java dovrai ancora bisogno di un sacco di memoria libera per farlo funzionare in modo efficiente.

D'altra parte, al giorno d'oggi 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 in genere verrebbero risolti utilizzando una macchina a 64 bit e lanciando tutti i moduli RAM su di essa, se necessario. Vedete, il costo dell'hardware non è affatto vicino al costo del tempo di sviluppo nel mondo sviluppato al giorno d'oggi.

Penso che dovresti prendere seriamente in considerazione questa opzione, e se possibile, vai con questa opzione e con Java invece di C ++, perché è molto più facile sviluppare qualcosa in Java che in C ++, e continuare a mantenerlo in seguito.

    
risposta data 14.01.2012 - 14:43
fonte
7

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

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

La soluzione corretta (in C ++) è l'uso di contenitori e puntatori intelligenti attraverso classi di allocatori che gestiscono l'allocazione mediante "plexes" fissi (il punto chiave, qui, sta scrivendo una buona classe allocatore). E questo è uno stile di programmazione che non ha nulla a che fare con Java, quindi qualsiasi confronto non ha senso.

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

    
risposta data 14.01.2012 - 10:12
fonte
2

Il vantaggio della garbage collection è che simula una macchina con una quantità infinita di memoria. Il meccanismo o l'implementazione di tale astrazione è destinato a essere completamente trasparente per te come programmatore. Sappiamo tutti che il meccanismo sta recuperando la memoria che non è più utilizzata dal programma, ma non è in realtà garantita. Se si esegue il programma su una macchina con più RAM rispetto a quella effettivamente utilizzata dal programma, la raccolta di dati inutili potrebbe non avvenire mai. Di nuovo, irrilevante, perché puoi semplicemente scrivere il programma senza riguardo a come usa la memoria. Il gestore della memoria assegna solo più RAM ogni volta che il programma lo richiede, e ti è permesso assumere che tali allocazioni avranno sempre successo. Java è un linguaggio garbage-collected e C ++ no. 1

Lo svantaggio della garbage collection è che, come tutte le astrazioni , tende a perdere. Non sempre funziona perfettamente tutto il tempo, in particolare nei casi limite, ed è probabile che vi imbattete 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 casi comuni è che non sono mai così comuni. In generale , non puoi fare meglio di quanto possa fare il 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 dà questa flessibilità; Java no.

Tutto ciò detto, penso che il consiglio standard per la scelta di una lingua si applichi qui, forse anche di più in questo caso dati i vincoli. Scegli il linguaggio che è più familiare per gli sviluppatori primari del progetto. Oltre alle ovvie ragioni (come la possibilità di sviluppare l'app in modo più rapido ed efficiente), questo è particolarmente importante nel caso che descrivi perché programmare C ++ come se stessi programmando Java porterà a pratiche di gestione della memoria terribilmente inefficaci, e quindi a perdite e arresti anomali. Analogamente, programmare in Java come si sta programmando in C ++ non ti farà molto bene, e potrebbe finire per produrre un programma non ottimizzato, dato che gli algoritmi di garbage collection sono ottimizzati e ottimizzati per i casi più comuni .

I programmatori abituati a lavorare in lingue raccolte da garbage imparano a fidarsi del garbage collector, piuttosto che a lottare contro di esso. Se stai lavorando in una lingua raccolta dalla spazzatura, questi sono i programmatori che desideri sul tuo progetto. I programmatori che sono non abituati a lavorare in un linguaggio raccolto con garbage sono intrinsecamente scettici su una tale astrazione di "memoria infinita" e spesso con molte buone ragioni. Per quanto questi programmatori possano essere, questi non sono quelli che vuoi lavorare in un linguaggio spazzato via perché combatteranno contro il GC in ogni fase del processo, continuando a indovinare e producendo spesso meno memoria e meno efficienza codice diverso dall'altro tipo di programmatore. Nella migliore delle ipotesi, passeranno molto tempo a reinventare la ruota, costando un sacco di soldi e ancora di più con costi di manutenzione a lungo termine.

E poi devi anche chiedertelo se è davvero importante. C'è più di un accenno di verità al commento sniffato di Bo: la memoria è così a buon mercato ora, non vale la pena troppa torcitura. Anche se hai bisogno di importi massicci , tali importi non sono altrettanto elevati 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 anche che non dovresti perdere troppo tempo a farlo.

1 Naturalmente, questa ipotesi evidenzia un difetto più profondo nella domanda. A quanto pare, "Java o C ++" è un po 'una falsa pista. L'implementazione standard di Java fornisce la garbage collection e il C ++ non è conforme allo standard della lingua, ma non c'è assolutamente alcun motivo per cui non si possa usare 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.

    
risposta data 14.01.2012 - 17:03
fonte

Leggi altre domande sui tag