Memorizzazione di un valore vs riferimento alla chiamata per l'uso ripetuto in Java

1

Ho una vecchia abitudine di evitare di chiamare i riferimenti più volte, sia per un codice di lettura / manutenzione più semplice, sia per una possibile efficienza. Ma mi chiedo quale sia più efficiente (memoria, prestazioni, entrambi?).

Ad esempio quando si lavora con XML usando un parser VTD

if( vn.toString( vn.getCurrentIndex() ).equalsIgnoreCase( "broken-label" ) == false )
        {
            do
            {   
                if( parentNode != null )
                {
                    currentNode = parentNode.addChildNode( vn.toString( vn.getCurrentIndex() ) );
                }
                else
                {
                    currentNode = new xmlNode( vn.toString(vn.getCurrentIndex()), null );
                    treeNodes.add( 0, currentNode );
                }

Non memorizza il valore, forse risparmiando un sovraccarico per creare spazio per salvare una variabile locale e anche ridurre il carico sul garbage collector (supponendo che questa sezione di codice venga ripetuta migliaia di volte in rapida successione.

La mia abitudine a un codice più pulito / efficiente sarebbe sostituire il precedente con la semplice modifica di

String label = vn.toString( vn.getCurrentIndex();

if( label ).equalsIgnoreCase( "vsled-image" ) == false )
        {
            do
            {   
                if( parentNode != null )
                {
                    currentNode = parentNode.addChildNode( label ) );
                }
                else
                {
                    currentNode = new xmlNode( label, null );
                    treeNodes.add( 0, currentNode );
                }

Mentre questo è ovviamente più facile da leggere e mantenere. Ci sono benefici non umani?

    
posta FaultyJuggler 15.10.2013 - 23:54
fonte

3 risposte

0

Le chiamate di funzione sono costose. In questo esempio, utilizzando questa variabile, sono state eliminate quattro chiamate di funzioni separate. Ogni chiamata mette le cose nello stack delle chiamate, salta il puntatore delle istruzioni, crea comunque l'equivalente approssimativo delle nuove variabili , ecc. In molte occasioni, le funzioni chiamate creeranno quelle che sono davvero nuove variabili all'interno di definizioni pure.

Quindi, sì, in casi come questo, è meglio andare avanti e rendere quella variabile extra in alto. E se sei preoccupato a morte per questo, e sei disposto a sacrificare la modularità e la manutenibilità, potresti impostare la variabile al di fuori del corpo della funzione, prima che la funzione venga chiamata, e quindi riferirti semplicemente all'interno della funzione.

    
risposta data 16.10.2013 - 00:09
fonte
6

Se i metodi sono semplici getter non fa alcuna differenza in quanto saranno rasterizzati in fase di runtime.

Se i metodi non funzionano in modo semplice, chiamarli più spesso richiederà probabilmente più tempo. Per sapere esattamente quanto, dovrai profilare la tua applicazione.

Dal punto di vista della leggibilità, l'utilizzo di variabili ben scelte può migliorare il tuo codice.

    
risposta data 16.10.2013 - 00:27
fonte
0

Un punto non menzionato qui: vn.getCurrentIndex() potrebbe ottenere un valore diverso con ogni chiamata. La tua variabile locale manterrà il suo valore, che può essere molto utile.

(Un altro thread potrebbe cambiarlo oppure un metodo dall'aspetto banale che ovviamente non ha nulla a che fare con l'indice corrente potrebbe chiamare qualcosa che chiama qualcosa che ... cambia l'indice.)

    
risposta data 16.10.2013 - 22:02
fonte

Leggi altre domande sui tag