Informazioni sull'ambito della variabile VB.NET

0

Qual è la differenza tra questo snippet di codice:

Sub Test()
  Dim i as Integer = 0
  Dim q as String = ""
  While i<10
    q=String.Format("Some text {0}", i)
    Console.WriteLn(q)
    i=i+1
  End While
End Dub

e questo:

Sub Test()
  Dim i as Integer = 0
  While i<10
    Dim q as String = String.Format("Some text {0}", i)
    Console.WriteLn(q)
    i=i+1
  End While
End Dub

in termini di allocazione della memoria e prestazioni ...

    
posta David 20.04.2015 - 18:47
fonte

3 risposte

5

In termini di allocazione della memoria e prestazioni, il primo snippet contiene un'assegnazione superflua della stringa vuota a q prima di entrare nel ciclo.

Dal punto di vista delle prestazioni ciò non dovrebbe essere di alcuna importanza, ma dal punto di vista delle migliori pratiche di ingegneria del software, il secondo frammento è decisamente preferibile, poiché la variabile viene dichiarata nell'ambito in cui è usato.

La leggibilità e la manutenibilità sono molto più importanti delle prestazioni nella maggior parte degli scenari e, statisticamente parlando, le probabilità che la tua azienda sia un'eccezione a questa regola sono scarse.

La mia raccomandazione sarebbe di andare avanti e costruire il tuo prodotto software correttamente , e se si scopre che c'è un problema di prestazioni, (molto probabilmente non ci sarà essere qualsiasi,) quindi lancia il profiler per vedere esattamente dove si trova il problema, e una volta hai trovato i punti problematici, poi vai avanti e migliora solo quegli spot che necessitano miglioramenti.

Essere preoccupato per le prestazioni di ogni piccola piccola cosa da ogni parte, e modificare e hackerare le cose in modo proattivo qui e là solo per spremere i cicli di clock in modo cieco, senza avere alcuna idea se questi cicli di clock sono effettivamente necessari, non è modo di scrivere software.

I cicli di clock saranno sempre sprecati. Anche se hai abbandonato Visual Basic in favore di Assembly Language, presto scoprirai che è impossibile non sprecare cicli di clock. Il punto è preoccuparsi solo dei cicli di clock quando hai una buona ragione per farlo, e nella stragrande maggioranza dei casi non ne hai. Il software con prestazioni scadenti presenta scarso rendimento principalmente a causa di problemi algoritmici, non a causa della scarsa attenzione dei programmatori ai cicli di clock.

P.S.

Non so su Visual Basic, ma nella maggior parte dei linguaggi di programmazione decenti il compilatore è in grado di avvisarti se tenti di usare una variabile che non è ancora stata inizializzata, ma questa capacità del compilatore è compromessa dal pratica prevalente e molto fuorviante di inizializzare le variabili con valori predefiniti privi di senso come Dim q as String = "" sopra. Quindi, ti consiglio di evitare Dim q as String = "" come la peste.

    
risposta data 20.04.2015 - 21:52
fonte
0

Nel primo esempio, suppongo che la variabile sia stata dichiarata in anticipo per evitare problemi di garbage collection, eccetto che ci sono solo 10 iterazioni, e se non hai abbastanza RAM per gestirle, allora hai una maggiore un problema a portata di mano della gestione della memoria. Questo potrebbe essere utile dichiarare una variabile solo una volta, se quell'oggetto occupa molta memoria, ma la forzatura di una garbage collection potrebbe essere ancora necessaria, poiché il garbage collector non si raccoglie istantaneamente quando il riferimento a un oggetto non rientra nello scope . In generale cerco di mantenere le dichiarazioni all'interno dello scopo in cui vengono utilizzate, ma a volte potrebbe esserci un motivo per pre-definire le variabili. Pensa al motivo per cui lo stai facendo e fai un benchmark per vedere se aiuta a migliorare le tue prestazioni. Usa quello che funziona meglio per la tua situazione, se entrambi funzionano allo stesso modo, cerca di mantenere le cose dichiarate nell'ambito che sono utilizzate.

    
risposta data 28.04.2015 - 07:59
fonte
-2

Sono uguali in termini di prestazioni. In VB.NET, una variabile dichiarata all'interno di un loop mantiene il suo valore per la successiva itarazione.

Preferirei il primo esempio in quanto è più facile da leggere e probabilmente ha il comportamento previsto.

Ecco l'output dei due:

> Some text 0 
> Some text 1 
> Some text 2 
> Some text 3 
> Some text 4 
> Some text 5 
> Some text 6 
> Some text 7 
> Some text 8 
> Some text 9
> 
> Some text 0 
> Some text 1 
> Some text 2 
> Some text 3 
> Some text 4 
> Some text 5 
> Some text 6 
> Some text 7 
> Some text 8 
> Some text 9
> 
    
risposta data 20.04.2015 - 19:26
fonte

Leggi altre domande sui tag