Ayende @ Rahien

My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:


+972 52-548-6969

, @ Q c

Posts: 6,130 | Comments: 45,560

filter by tags archive

UberProf performance improvements, nothing helps if you are stupid

time to read 2 min | 274 words

The following change took a while to figure out, but it was a huge performance benefit (think, 5 orders of magnitude). The code started as:

private readonly Regex startOfParametersSection = 
            new Regex(@"(;\s*)[@:?]p0 =", RegexOptions.Compiled);

And the optimization is:

private static readonly Regex startOfParametersSection = 
            new Regex(@"(;\s*)[@:?]p0 =", RegexOptions.Compiled);

The story behind this is interesting, this piece of code (and a few others like it) used to be in a class that has a singleton lifestyle. At some point, it was refactored into a command class that is created often, which obviously had… drastic effect on the system performance.



Funny bug. It seems this object was polluting address space of application while being compiled again and again into new assembly and hooking up till app ends.

Frans Bouma

still odd though, as creating a regex will always pull a cached instance into itself which does the actual work. You have a little bit of overhead from looking up the instance and the key construction (check the ctor) but it's not recompiled over and over again. So that it has drastic performance improvements is a little unexpected.

James Newton-King

Creating a new Regex object with the compiled option does cause it to be compiled over and over, destroying performance. I've been caught out by it myself.

The solution is to either reuse the same object or use one of the static methods on Regex, which do look up to see whether a compiled instance of the regex already exists.


MS actually recommend to use the static methods on Regex in most cased since it'll be cached automatically. I've always found it more intuitive to do the caching myself hence turn it into a static field.

Ayende Rahien


The problem is that you only get ~15 LRU cache.

That doesn't work for something like the profiler, who does a LOT of regexes


Have you tought about not using Regexes at all?

Ayende Rahien

I have to do a lot of text processing.

Can you think of anything better suited than regexes to do that?

From both performance and maintainability points of view?

Kelly Stuard

"Nothing helps if you are stupid" -- love it; my QOTD!

Chris Kemp

Definitely QOTD, and quite fitting, given the emails that I've just been handling today.

Comment preview

Comments have been closed on this topic.


  1. RavenDB Conference 2016–Slides - one day from now

There are posts all the way to Jun 01, 2016


  1. The design of RavenDB 4.0 (14):
    26 May 2016 - The client side
  2. RavenDB 3.5 whirl wind tour (14):
    25 May 2016 - Got anything to declare, ya smuggler?
  3. Tasks for the new comer (2):
    15 Apr 2016 - Quartz.NET with RavenDB
  4. Code through the looking glass (5):
    18 Mar 2016 - And a linear search to rule them
  5. Find the bug (8):
    29 Feb 2016 - When you can't rely on your own identity
View all series


Main feed Feed Stats
Comments feed   Comments Feed Stats