Credo che, in base alla progettazione degli implementatori GC, non è possibile accelerare GC con annullamento. Sono sicuro che preferirebbero che non ti preoccupassi di come / quando GC funziona - trattalo come questo onnipresente Essere protettivo e vegliare su e fuori per te ... (inchini a testa in giù, alza il pugno verso il cielo) .. .
Personalmente, ho spesso impostato esplicitamente le variabili su null quando ho finito con loro come una forma di auto documentazione. Non dichiaro, uso, quindi imposto su null in seguito - null immediatamente dopo che non sono più necessari. Sto dicendo esplicitamente: "Ho ufficialmente finito con te ... vattene ..."
L'annullamento è necessario in un linguaggio GC? No. È utile per il GC? Forse sì, forse no, non lo so per certo, in base alla progettazione non riesco davvero a controllarlo, e indipendentemente dalla risposta di oggi con questa versione o quella, le future implementazioni GC potrebbero cambiare la risposta al di fuori del mio controllo. Inoltre se / quando l'ottimizzazione è ottimizzata è poco più che un commento di fantasia se vuoi.
Immagino che se chiarisca le mie intenzioni al prossimo povero idiota che segue le mie orme e se "potrebbe" potenzialmente aiutare GC a volte, allora ne vale la pena. Principalmente mi fa sentire ordinato e chiaro, e a Mongo piace sentirmi ordinato e chiaro. :)
Lo guardo in questo modo: esistono linguaggi di programmazione per consentire alle persone di dare ad altre persone un'idea di intenti e di un compilatore una richiesta di lavoro su cosa fare - il compilatore converte quella richiesta in un linguaggio diverso (a volte diversi) per una CPU - la CPU (s) potrebbe dare un grido che lingua hai usato, le impostazioni della scheda, i commenti, le sottolineature stilistiche, i nomi delle variabili, ecc. - una CPU è tutto sul flusso di bit che gli dice quali registri e codici operativi e posizioni di memoria da modificare. Molte cose scritte nel codice non si convertono in ciò che viene consumato dalla CPU nella sequenza che abbiamo specificato. Il nostro C, C ++, C #, Lisp, Babel, assemblatore o qualsiasi altra cosa sia la teoria piuttosto che la realtà, scritta come una dichiarazione di lavoro. Quello che vedi non è quello che ottieni, sì, anche nel linguaggio assemblatore.
Capisco la mentalità delle "cose inutili" (come le righe vuote) "non sono altro che rumore e ingombrare il codice". Sono stato io all'inizio della mia carriera; Lo capisco perfettamente. A questo punto mi chino verso ciò che rende il codice più chiaro. Non è che sto aggiungendo anche 50 righe di "rumore" ai miei programmi - sono alcune righe qui o là.
Ci sono eccezioni a qualsiasi regola. In scenari con memoria volatile, memoria statica, condizioni di gara, singleton, utilizzo di dati "non aggiornati" e tutto quel tipo di marciume, questo è diverso: è NECESSARIO gestire la propria memoria, bloccare e annullare come apostrofo perché la memoria non fa parte di l'Universo GC: spero che tutti lo capiscano. Il resto del tempo con i linguaggi GC'd è una questione di stile piuttosto che di necessità o di un aumento delle prestazioni garantito.
Alla fine della giornata assicurati di capire cosa è idoneo per GC e cosa no; bloccare, smaltire e annullare in modo appropriato; ceretta, ceretta; inspirare ed espirare; e per tutto il resto dico: se ti fa sentire bene, fallo. Il tuo chilometraggio può variare ... come dovrebbe ...