Ayende @ Rahien

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

ayende@ayende.com

+972 52-548-6969

, @ Q c

Posts: 5,953 | Comments: 44,409

filter by tags archive

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
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

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.

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

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

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.

FUTURE POSTS

No future posts left, oh my!

RECENT SERIES

  1. The RavenDB Comic Strip (3):
    28 May 2015 - Part III – High availability & sleeping soundly
  2. Special Offer (2):
    27 May 2015 - 29% discount for all our products
  3. RavenDB Sharding (3):
    22 May 2015 - Adding a new shard to an existing cluster, splitting the shard
  4. Challenge (45):
    28 Apr 2015 - What is the meaning of this change?
  5. Interview question (2):
    30 Mar 2015 - fix the index
View all series

Syndication

Main feed Feed Stats
Comments feed   Comments Feed Stats