2011-09-28 13 views
31

So che il modo normale di ottenere le dimensioni di un file potrebbe essere quella di utilizzare un'istanza FileInfo:C'è un modo per ottenere la dimensione di un file in .NET usando un metodo statico?

using System.IO; 
class SizeGetter 
{ 
    public static long GetFileSize(string filename) 
    { 
    FileInfo fi = new FileInfo(filename); 
    return fi.Length; 
    } 
} 

C'è un modo per fare la stessa cosa senza dover creare un'istanza di FileInfo, utilizzando una statica metodo?

Forse sto cercando di essere eccessivamente avaro con la creazione di una nuova istanza ogni volta che voglio una dimensione del file, ma prendere ad esempio cercando di calcolare la dimensione totale di una directory contenente più di 5000 file. Come ottimizzato come potrebbe essere il GC, non dovrebbe esserci un modo per farlo senza doverlo tassare inutilmente?

+2

Sei sicuro che questo è collo di bottiglia della tua app? Immagino non allora perché preoccuparsi. – Andrey

+6

@Andrey Non è tanto un collo di bottiglia quanto una questione di uso efficiente della lingua e del garbage collector. Queste cose valgono sempre la pena di essere messe in discussione, specialmente se non si conoscono le sfumature del GC. Non sarebbe la prima volta che sono accusato di eccesso di ottimismo, ma preferisco non essere troppo preoccupato per queste cose piuttosto che non preoccuparmi. Inoltre, non ci vogliono solo pochi minuti per fare una domanda. – Will

risposta

14

Non preoccuparti. Innanzitutto, l'allocazione in .NET è economica. Secondo, quell'oggetto sarà in gen 0 quindi dovrebbe essere raccolto senza troppi sovraccarichi.

+2

Avevo capito che, ma essendo un vecchio C++, alcune vecchie abitudini di ottimizzazione/efficienza sono dure a morire. – Will

+4

@Will ho la sensazione che il funzionamento interno di FileInfo aggiunga un sovraccarico maggiore rispetto all'allocazione e al GC dell'oggetto stesso. Inoltre c'è una regola del pollice giusto: prima salva il tuo tempo. Se non è un collo di bottiglia, non preoccuparti. Solitamente le piccole ottimizzazioni non valgono i soldi che il tuo datore di lavoro ti ha pagato mentre eri occupato ad ottimizzare (almeno agli occhi di un datore di lavoro). Quindi il mio consiglio: considera una cattiva abitudine e non preoccuparti. ;) – Dmitry

15

Non preoccuparti.

  • ho trovato un post sul blog di qualcuno che ha misurato il sovraccarico di creazione di oggetti in .NET (C# Object Creation Time Trials), e, a quanto pare, la creazione di 10.000 oggetti in 0.03 secondi, vale a dire, 3 ms per oggetto . Il tempo richiesto per leggere la lunghezza del file dal file system sicuramente domina in modo significativo quei 3 microsecondi.

  • Un sacco di metodi statici nel framework .NET creano internamente oggetti e richiamano metodi di istanza su di essi (è possibile verificarlo osservando la sorgente di riferimento o utilizzando uno strumento di riflessione). Si assumere che un metodo statico è più veloce. Non fare tali presupposti. Se hai due modi per fare la stessa cosa, misura quale è più veloce.

+0

+1 per il collegamento al blog; buona lettura, e visto che sono un convertito da C++ a C# :) Ci stiamo ancora abituando a dove è interessato il GC, e se è davvero così efficiente, che hai ragione, la mia preoccupazione è ingiustificata . Grazie – Will

+0

L'allocazione è molto economica, ma la pulizia potrebbe non esserlo. –

Problemi correlati