2011-09-28 22 views
31

sé la forma habitual de conseguir el tamaño de un archivo sería utilizar una instancia de FileInfo:¿Hay alguna manera de obtener el tamaño de un archivo en .NET usando un método estático?

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

¿Hay una manera de hacer lo mismo sin tener que crear una instancia de FileInfo, utilizando un estático ¿método?

Tal vez estoy tratando de ser demasiado tacaño con la creación de una nueva instancia cada vez que quiero un tamaño de archivo, pero por ejemplo, tratando de calcular el tamaño total de un directorio que contiene más de 5000 archivos. ¿Tan optimizado como el GC puede ser, no debería haber una manera de hacer esto sin tener que gravarlo innecesariamente?

+2

¿Seguro que esto es cuello de botella de su aplicación? Supongo que no, entonces, ¿para qué molestarse? – Andrey

+6

@Andrey No es tanto un cuello de botella como una cuestión de uso eficiente del lenguaje y del recolector de basura. Tales cosas siempre valen la pena cuestionarlas, especialmente si no está familiarizado con los matices del GC. No sería la primera vez que me acusan de optimizar demasiado, pero prefiero equivocarme por estar demasiado preocupado por esas cosas en lugar de no molestarme. Además, no toma más que unos pocos minutos para hacer una pregunta. – Will

Respuesta

14

No te preocupes. Primero, la asignación en .NET es barata. Segundo, ese objeto estará en gen 0 por lo que debe ser recolectado sin mucha sobrecarga.

+2

Me lo había imaginado, pero al ser un chico viejo de C++, algunos viejos hábitos acerca de la optimización/eficiencia se vuelven difíciles. – Will

+4

@ Will Tengo la sensación de que el trabajo interno de FileInfo agrega mucho más sobrecarga que la asignación y GC del objeto en sí. También hay una regla de pulgar derecho: primero guarde su tiempo. Si no es un cuello de botella, no te molestes. Por lo general, las pequeñas optimizaciones no valen la pena el dinero que su empleador le pagó mientras estaba ocupado optimizando (al menos a los ojos de un empleador). Así que mi consejo: concédenlo un mal hábito y no te molestes. ;) – Dmitry

15

No te preocupes.

  • he encontrado un blog de alguien que mide la sobrecarga de la creación de objetos en .NET (C# Object Creation Time Trials), y, como resultado, la creación de 10.000 objetos tomó 0,03 segundos, es decir, 3 S por objeto . El tiempo requerido para leer la longitud del archivo desde el sistema de archivos seguramente dominará significativamente esos 3 microsegundos.

  • Muchos métodos estáticos en .NET Framework crean internamente objetos y llaman a los métodos de instancia (puedes verificar esto mirando la fuente de referencia o usando alguna herramienta de reflexión). Usted asume que un método estático es más rápido. No hagas tales suposiciones. Si tiene dos formas de hacer lo mismo, mida cuál es más rápido.

+0

+1 para el enlace del blog; buena lectura, y acertada dado que soy un convertidor de C++ a C# :) Todavía me está costando acostumbrarme al GC, y si realmente es así de eficiente, entonces tienes razón, mi preocupación es injustificada. . Gracias – Will

+0

La asignación es muy económica, pero puede que no sea así. –

Cuestiones relacionadas