Dela via


Kompilering och återanvändning i reguljära uttryck

Du kan optimera prestandan för program som använder reguljära uttryck i stor utsträckning genom att förstå hur reguljära uttrycksmotorn kompilerar uttryck och genom att förstå hur reguljära uttryck cachelagras. I det här avsnittet beskrivs både kompilering och cachelagring.

Kompilerade reguljära uttryck

Som standard kompilerar motorn för reguljära uttryck ett reguljärt uttryck till en sekvens med interna instruktioner (det här är högnivåkoder som skiljer sig från vanligt mellanliggande språk eller CIL). När motorn kör ett reguljärt uttryck tolkas de interna koderna.

Om ett Regex objekt skapas med RegexOptions.Compiled alternativet kompilerar det reguljära uttrycket till explicit CIL-kod i stället för interna instruktioner för reguljära uttryck på hög nivå. Detta tillåter . NET:s jit-kompilator (just-in-time) för att konvertera uttrycket till inbyggd datorkod för högre prestanda. Kostnaden för att Regex konstruera objektet kan vara högre, men kostnaden för att utföra matchningar med det är sannolikt mycket mindre.

Ett alternativ är att använda förkompilerade reguljära uttryck. Du kan kompilera alla dina uttryck till en återanvändbar DLL med hjälp CompileToAssembly av metoden . På så sätt undviker du behovet av att kompilera vid körning samtidigt som du drar nytta av hastigheten för kompilerade reguljära uttryck.

Cacheminnet för reguljära uttryck

För att förbättra prestandan upprätthåller motorn för reguljära uttryck en programomfattande cache med kompilerade reguljära uttryck. Cachen lagrar mönster för reguljära uttryck som endast används i statiska metodanrop. (Reguljära uttrycksmönster som tillhandahålls till instansmetoder cachelagras inte.) På så sätt undviker du behovet av att ange ett uttryck i bytekod på hög nivå varje gång det används.

Det maximala antalet cachelagrade reguljära uttryck bestäms av värdet för static egenskapen (Shared i Visual Basic). Regex.CacheSize Som standard cachelagrar motorn för reguljära uttryck upp till 15 kompilerade reguljära uttryck. Om antalet kompilerade reguljära uttryck överskrider cachestorleken ignoreras det senast använda reguljära uttrycket och det nya reguljära uttrycket cachelagras.

Ditt program kan återanvända reguljära uttryck på något av följande två sätt:

  • Genom att använda en statisk metod för Regex objektet för att definiera det reguljära uttrycket. Om du använder ett mönster för reguljära uttryck som redan har definierats av ett annat statiskt metodanrop försöker motorn för reguljära uttryck hämta det från cacheminnet. Om den inte är tillgänglig i cacheminnet kompilerar motorn det reguljära uttrycket och lägger till det i cacheminnet.

  • Genom att återanvända ett befintligt Regex objekt så länge det reguljära uttrycksmönstret behövs.

På grund av omkostnaderna för instansiering av objekt och kompilering av reguljära uttryck är det mycket dyrt att skapa och snabbt förstöra många Regex objekt. För program som använder ett stort antal olika reguljära uttryck kan du optimera prestanda med hjälp av anrop till statiska Regex metoder och eventuellt genom att öka storleken på cacheminnet för reguljära uttryck.

Se även