On Thu, Apr 13, 2017 at 8:51 AM, Zoltán Herczeg <hzmes...@freemail.hu> wrote: > Hi, > >>>>I did some basic performance benchmarks between v1 and v2 of PCRE. >>>>Depending on whether we use git-grep or git-log v2 is 1% to 10% slower >>>>than v1 when both use JIT. >>> >>> I would like to see the compilation flags for both pcre1 and pcre2? By >>> default the library compiles without optimization options which has the >>> same effect as -O0 option. This could be changed by setting up a CFLAGS >>> value. >> >>I did some further performance testing and it turns out much of this >>was just due to me not compiling with -O3. I pulled pcre & pcre2 from >>latest svn, built them both with: >> >> CXXFLAGS=-O3 CFLAGS=-O3 ./configure --prefix=$PWD/inst --enable-jit >> >>And then linked git against those respective libraries, also compiled >>with -O3. I also fixed the bug you mentioned with not sharing >>pcre2_match_data_create_from_pattern(), that's now constructed when >>the pattern is compiled. Thanks! >> >>I then patched git itself so it won't try to take a non-pcre path for >>fixed patterns[1], and ran a basic grep benchmark[2]. This shows: >> >> s/iter extended basic pcre2 pcre1 fixed >>extended 2.07 -- -0% -49% -50% -50% >>basic 2.07 0% -- -49% -49% -50% >>pcre2 1.05 97% 97% -- -0% -1% >>pcre1 1.05 98% 98% 0% -- -0% >>fixed 1.04 99% 99% 1% 0% -- >> >>I.e. no difference in v1 & v2 anymore. The log case though shows pcre1 >>being 2% faster than pcre2: >> >> s/iter basic extended pcre2 pcre1 fixed >>basic 6.28 -- -0% -16% -17% -18% >>extended 6.27 0% -- -16% -17% -18% >>pcre2 5.28 19% 19% -- -2% -3% >>pcre1 5.19 21% 21% 2% -- -1% >>fixed 5.13 23% 22% 3% 1% -- > > before a match start pcre initializes a lot of local variables and checks > arguments. This overhead is a bit more costly for pcre2 because it has more > features. This fixed cost must be payed every time you call pcre2_match and > it accumulates if you frequently call it ("log" matches frequently). > Pcre/pcre2 provides a low-level JIT matcher function called pcre_jit_exec / > pcre2_jit_match which has a lower overhead because it does not check > arguments.
Thanks, I forgot to say that in my latest test I changed to calling pcre_jit_exec... > If you want to use JIT in production level please also consider using the JIT > stack, because the default 32K stack is not enough for heavy recursions. It > is easy to use it for single threaded applications since you only need to > allocate a single jit stack (and store it in a global variable). > > pcre2_jit_stack_create / pcre2_jit_stack_assign / pcre2_jit_stack_free ...but wasn't allocating the stack for pcre2 like that, but only for pcre1 (where I think it can't be avoided). Will do that & check how that performs. Thanks again. -- ## List details at https://lists.exim.org/mailman/listinfo/pcre-dev