Come le persone hanno sottolineato - GC è più veloce da allocare (perché ti dà solo il prossimo blocco sulla sua lista), ma in generale più lento (perché deve compattare l'heap regolarmente, in modo che gli allocati siano veloci).
così - andare per la soluzione di compromesso (che in realtà è dannatamente buono):
È possibile creare i propri mucchi, uno per ogni dimensione dell'oggetto in genere si assegnano (o 4 byte, 8 byte, 16- byte, 32 byte, ecc.) quindi, quando vuoi un nuovo pezzo di memoria, prendi l'ultimo "blocco" nell'heap appropriato. Poiché si esegue la pre-allocazione da questi heap, tutto ciò che è necessario fare quando si assegna è catturare il prossimo blocco libero. Funziona meglio rispetto all'allocatore standard perché si sta sprecando volentieri memoria: se si desidera allocare 12 byte, si lascerà un intero blocco da 16 byte dall'heap da 16 byte. Mantieni una bitmap dei blocchi v utilizzati, in modo che tu possa allocare rapidamente senza sprecare memoria o dover compattare.
Inoltre, poiché si stanno eseguendo diversi heap, i sistemi ad alto parallelismo funzionano molto meglio in quanto non è necessario bloccarli così spesso (ovvero si hanno più blocchi per ogni heap in modo da non ottenere la contesa quasi tanto)
Provalo - lo abbiamo usato per sostituire l'heap standard in un'applicazione molto intensiva, le prestazioni sono aumentate parecchio.
BTW. il motivo per cui gli allocatori standard sono lenti è che cercano di non sprecare memoria, quindi se si allocano 5 byte, 7 byte e 32 byte dall'heap standard, verranno mantenuti quei "limiti". La prossima volta che dovrai allocare, camminerà tra quelli che cercano uno spazio sufficiente per darti quello che hai chiesto. Questo ha funzionato bene per i sistemi a bassa memoria, ma devi solo vedere quanta memoria la maggior parte delle app usa oggi per vedere che i sistemi GC vanno diversamente, e cercare di rendere le allocazioni il più rapide possibile senza preoccuparsi di quanta memoria ci sia sprecato.
Stai dicendo che tutto questo dipenderà dal linguaggio *, C o C++, uno usa? Dato che in entrambi questi linguaggi, uno deve implementare il GC di sé, penso che non ci siano variazioni per lingua, solo per variazione dell'algoritmo. –
Non completamente sicuro di quello che stai chiedendo. Ma gli stessi algoritmi di gestione della memoria possono essere applicati a entrambe le lingue. Tuttavia in C++ farebbe qualcosa di simile a sostituire l'operatore new e delete per implementarlo. In C non sono sicuro; eventualmente nominare le proprie funzioni e accertarsi di usarle per tutte le assegnazioni. –