2011-03-28 14 views
5

Anoche escribí mi primer IHttpModule para hacer un procesamiento de solicitud. Estoy usando una expresión regular para inspeccionar la URL en bruto. Se llamará al IHttpModule en cada solicitud, por lo que parece razonable hacer algún tipo de almacenamiento en caché del objeto de expresión regular para evitar su creación en cada solicitud.¿Qué es mejor: el almacenamiento en caché a través de HttpContext.Current.Cache o solo una estática?

Ahora mi pregunta ... ¿qué es mejor: usar el HttpContext.Current.Cache para almacenar el objeto instanciado o para usar un private static Regex en mi módulo?

Estoy esperando las razones por las cuales. Solo para aclarar: la expresión regular nunca cambiará y, por lo tanto, siempre será lo mismo.

Respuesta

11

Si la expresión regular no va a cambiar (y por lo general no lo es), entonces:

private static readonly Regex pattern = new Regex("...", RegexOptions.Compiled); 

es el más rápido y más eficiente en todos los sentidos

+0

¿Pero no existe el riesgo de que el 'patrón' sea nulo si el proceso se recicla? – Aliostad

+3

@Aliostad - no. dado que es una propiedad estática de la clase, se volverá a crear cuando se haga referencia por primera vez a la clase. – tvanfosson

+0

Sí, tienes razón. Gracias. La magia es 'readonly' de hecho! – Aliostad

3

supongo que depende. La memoria caché integrada puede ofrecerle control de caducidad automático, mientras que los objetos estáticos no pueden. Además, si desea cambiar el mecanismo de caché (supongamos que debe distribuir su aplicación) puede hacerlo con un caché integrado. Los objetos estáticos son solo eso, estáticos.

+1

si bien es cierto, para una expresión regular simple, tales preocupaciones suelen ser excesivas –

+1

@Marc: iría aún más lejos y diría que es un olor codicioso (¿Generalidad especulativa?) . Ha creado una dependencia que no necesita existir, es decir, lo que debería ser una propiedad estática ahora son datos en una clase no relacionada. – tvanfosson

3

Por regla general, utilizaría un campo estático y guardaría el almacenamiento en caché para cuando necesite más control de la vida útil del objeto. Aquí hay dos razones que se me ocurren justo por delante:

  • siempre hay algo de sobrecarga implicada en el almacenamiento en caché el objeto y recuperarla de la memoria caché, por lo menos habrá boxeo/unboxing
  • Usted tendrá que acceder el artículo por una clave de caché en lugar de hacerlo directamente en el código, esto hace que la aplicación de un poco más voluminoso y más difícil de entender

usted debe preguntarse si necesidad la funcionalidad se obtiene mediante el almacenamiento en caché del objeto, es decir, toda la vida.

Cuestiones relacionadas