Don’t get me wrong, regex is awesome, and entirely useful—sometimes it’s the only option, it’s just not the best tool of choice for wire speed applications.  Often the sys-admin and network type converts to BIG-IP will find the regexp tcl command and go that route because it’s familiar.  If that describes you, please let me introduce you to a couple more appropriate commands:

These two commands will cover a great percentage of regexp’s use cases, and will save significant resources on the system.  Don’t buy it?  Here’s an example:

% set ip ""
% time { scan $ip {%d.%d.%d.%d} a b c d} 10000
2.1713 microseconds per iteration
% time {regexp {([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})} $ip matched a b c d} 10000
34.2604 microseconds per iteration

Two approaches, same result.  The time to achieve that result?  The scan command bests regexp by far.  I’ll save you the calculation…that’s a 93.7% reduction in processing time.  93.7 percent! Now, mind you, the difference between 2 and 34 microseconds will be negligible to an individual request’s response time, but in the context of a single system handling hundreds of thousands or even millions of request per second, the difference matters.  A lot.

Thanks to (who else?) hoolio for the example.  For other optimization considerations, check out the iRules Optimization 101 series.

Related Articles