Ayende @ Rahien

It's a girl

UberProf performance improvements, nothing helps if you are stupid

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.

Comments

meo
12/25/2009 10:35 AM by
meo

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
12/25/2009 10:39 AM by
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
12/25/2009 11:26 AM by
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.

firefly
12/25/2009 03:16 PM by
firefly

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
12/25/2009 08:14 PM by
Ayende Rahien

Firefly,

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

Peli
12/26/2009 12:25 AM by
Peli

Have you tought about not using Regexes at all?

Ayende Rahien
12/26/2009 06:40 AM by
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
12/28/2009 04:31 PM by
Kelly Stuard

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

Chris Kemp
01/08/2010 02:38 PM by
Chris Kemp

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

Comments have been closed on this topic.