| Home | Libraries | People | FAQ | More

### Appendix 4: Performance Comparison

The performance of xpressive is competitive with Boost.Regex. I have run performance benchmarks comparing static xpressive, dynamic xpressive and Boost.Regex on two platforms: gcc (Cygwin) and Visual C++. The tests include short matches and long searches. For both platforms, xpressive comes off well on short matches and roughly on par with Boost.Regex on long searches.

<disclaimer> As with all benchmarks, the true test is how xpressive performs with your patterns, your input, and your platform, so if performance matters in your application, it's best to run your own tests. </disclaimer>

#### xpressive vs. Boost.Regex with GCC (Cygwin)

Below are the results of a performance comparison between:

- static xpressive
- dynamic xpressive
- Boost.Regex

Test Specifications

Hardware:

  hyper-threaded 3GHz Xeon with 1Gb RAM

Operating System:

  Windows XP Pro + Cygwin

Compiler:

  GNU C++ version 3.4.4 (Cygwin special)

C++ Standard Library:

  GNU libstdc++ version 3.4.4

Boost.Regex Version:

  1.33+, BOOST_REGEX_USE_CPP_LOCALE, BOOST_REGEX_RECURSIVE

xpressive Version:

  0.9.6a

### Comparison 1: Short Matches

The following tests evaluate the time taken to match the expression to the input string. For each result, the top number has been normalized relative to the fastest time, so 1.0 is as good as it gets. The bottom number (in parentheses) is the actual time in seconds. The best time has been marked in green.

##### Short Matches

static xpressive | dynamic xpressive | Boost | Text | Expression
--- | --- | --- | --- | ---
1 (8.79e‑07s) | 1.08 (9.54e‑07s) | 2.51 (2.2e‑06s) | 100- this is a line of ftp response which contains a message string | `^([0-9]+)(\-| |$)(.*)$`
1.06 (1.07e‑06s) | 1 (1.01e‑06s) | 4.01 (4.06e‑06s) | 1234-5678-1234-456 | `([[:digit:]]{4}[- ]){3}[[:digit:]]{3,4}`
1 (1.4e‑06s) | 1.13 (1.58e‑06s) | 2.89 (4.05e‑06s) | john_maddock@compuserve.com | `^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$`
1 (1.28e‑06s) | 1.16 (1.49e‑06s) | 3.07 (3.94e‑06s) | foo12@foo.edu | `^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$`
1 (1.22e‑06s) | 1.2 (1.46e‑06s) | 3.22 (3.93e‑06s) | bob.smith@foo.tv | `^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$`
1.04 (8.64e‑07s) | 1 (8.34e‑07s) | 2.5 (2.09e‑06s) | EH10 2QQ | `^[a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1} {0,1}[0-9][A-Za-z]{2}$`
1.11 (9.09e‑07s) | 1 (8.19e‑07s) | 2.47 (2.03e‑06s) | G1 1AA | `^[a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1} {0,1}[0-9][A-Za-z]{2}$`
1.12 (9.38e‑07s) | 1 (8.34e‑07s) | 2.5 (2.08e‑06s) | SW1 1ZZ | `^[a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1} {0,1}[0-9][A-Za-z]{2}$`
1 (7.9e‑07s) | 1.06 (8.34e‑07s) | 2.49 (1.96e‑06s) | 4/1/2001 | `^[[:digit:]]{1,2}/[[:digit:]]{1,2}/[[:digit:]]{4}$`
1 (8.19e‑07s) | 1.04 (8.49e‑07s) | 2.4 (1.97e‑06s) | 12/12/2001 | `^[[:digit:]]{1,2}/[[:digit:]]{1,2}/[[:digit:]]{4}$`
1.09 (8.95e‑07s) | 1 (8.19e‑07s) | 2.4 (1.96e‑06s) | 123 | `^[-+]?[[:digit:]]*\.?[[:digit:]]*$`
1.11 (8.79e‑07s) | 1 (7.9e‑07s) | 2.57 (2.03e‑06s) | +3.14159 | `^[-+]?[[:digit:]]*\.?[[:digit:]]*$`
1.09 (8.94e‑07s) | 1 (8.19e‑07s) | 2.47 (2.03e‑06s) | -3.14159 | `^[-+]?[[:digit:]]*\.?[[:digit:]]*$`

### Comparison 2: Long Searches

The next test measures the time to find all matches in a long English text. The text is the complete works of Mark Twain, from Project Gutenberg. The text is 19Mb long. As above, the top number is the normalized time and the bottom number is the actual time. The best time is in green.

##### Long Searches

static xpressive | dynamic xpressive | Boost | Expression
--- | --- | --- | ---
1 (0.0263s) | 1 (0.0263s) | 1.78 (0.0469s) | `Twain`
1 (0.0234s) | 1 (0.0234s) | 1.79 (0.042s) | `Huck[[:alpha:]]+`
1.84 (1.26s) | 2.21 (1.51s) | 1 (0.687s) | `[[:alpha:]]+ing`
1.09 (0.192s) | 2 (0.351s) | 1 (0.176s) | `^[^ ]*?Twain`
1.41 (0.08s) | 1.21 (0.0684s) | 1 (0.0566s) | `Tom|Sawyer|Huckleberry|Finn`
1.56 (0.195s) | 1.12 (0.141s) | 1 (0.125s) | `(Tom|Sawyer|Huckleberry|Finn).{0,30}river|river.{0,30}(Tom|Sawyer|Huckleberry|Finn)`