From adc7be2d3abf99d5f750c8f3fc6eb10a462423a9 Mon Sep 17 00:00:00 2001 From: "Philip.Hazel" Date: Wed, 12 Nov 2014 17:46:02 +0000 Subject: [PATCH] Get rid of remaining FIXMEs in the code; implement JIT compile timing. --- doc/pcre2test.1 | 9 ++++---- src/pcre2_compile.c | 4 ---- src/pcre2_dfa_match.c | 14 ------------ src/pcre2_jit_match.c | 2 -- src/pcre2_match.c | 12 ----------- src/pcre2_pattern_info.c | 12 ----------- src/pcre2test.c | 46 +++++++++++++++++++++++++++++++++------- 7 files changed, 43 insertions(+), 56 deletions(-) diff --git a/doc/pcre2test.1 b/doc/pcre2test.1 index ce494f4..7bc8593 100644 --- a/doc/pcre2test.1 +++ b/doc/pcre2test.1 @@ -160,10 +160,11 @@ Behave as if each subject line contains the given modifiers. .TP 10 \fB-t\fP Run each compile and match many times with a timer, and output the resulting -times per compile or match. You can control the number of iterations that are -used for timing by following \fB-t\fP with a number (as a separate item on the -command line). For example, "-t 1000" iterates 1000 times. The default is to -iterate 500,000 times. +times per compile or match. When JIT is used, separate times are given for the +initial compile and the JIT compile. You can control the number of iterations +that are used for timing by following \fB-t\fP with a number (as a separate +item on the command line). For example, "-t 1000" iterates 1000 times. The +default is to iterate 500,000 times. .TP 10 \fB-tm\fP This is like \fB-t\fP except that it times only the matching phase, not the diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c index b85cd5a..e1eb5b9 100644 --- a/src/pcre2_compile.c +++ b/src/pcre2_compile.c @@ -7734,10 +7734,6 @@ re->top_bracket = cb.bracount; re->top_backref = cb.top_backref; re->max_lookbehind = cb.max_lookbehind; -#ifdef FIXME /* Is this necessary? Set above */ -re->flags = cb.external_flags | PCRE2_MODE; -#endif - if (cb.had_accept) { reqcu = 0; /* Must disable after (*ACCEPT) */ diff --git a/src/pcre2_dfa_match.c b/src/pcre2_dfa_match.c index fa9ccc7..1f7c6d9 100644 --- a/src/pcre2_dfa_match.c +++ b/src/pcre2_dfa_match.c @@ -3103,25 +3103,11 @@ if (re == NULL || subject == NULL || workspace == NULL || match_data == NULL) if (wscount < 20) return PCRE2_ERROR_DFA_WSSIZE; if (start_offset > length) return PCRE2_ERROR_BADOFFSET; -/* FIXME: Remove BADENDIANNESS if saving/restoring is not to be implemented. */ - /* Check that the first field in the block is the magic number. If it is not, return with PCRE2_ERROR_BADMAGIC. */ if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC; -#ifdef FIXME -If saving restoring gets implemented, define PCRE2_ERROR_BADENDIANNESS, and add -this comment and code: - -/* However, if the magic number is equal to REVERSED_MAGIC_NUMBER we return -with PCRE2_ERROR_BADENDIANNESS, which means that the pattern is likely compiled -with different endianness. */ - - return re->magic_number == REVERSED_MAGIC_NUMBER? - PCRE2_ERROR_BADENDIANNESS:PCRE2_ERROR_BADMAGIC; -#endif - /* Check the code unit width. */ if ((re->flags & PCRE2_MODE_MASK) != PCRE2_CODE_UNIT_WIDTH/8) diff --git a/src/pcre2_jit_match.c b/src/pcre2_jit_match.c index 783bfa0..c6e8f71 100644 --- a/src/pcre2_jit_match.c +++ b/src/pcre2_jit_match.c @@ -82,8 +82,6 @@ Returns: > 0 => success; value is the number of ovector pairs filled < -1 => some kind of unexpected problem */ -/* FIXME: this is currently a placeholder function */ - PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_jit_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length, PCRE2_SIZE start_offset, uint32_t options, pcre2_match_data *match_data, diff --git a/src/pcre2_match.c b/src/pcre2_match.c index a949aae..0699895 100644 --- a/src/pcre2_match.c +++ b/src/pcre2_match.c @@ -6412,18 +6412,6 @@ if (start_offset > length) return PCRE2_ERROR_BADOFFSET; if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC; -#ifdef FIXME -If saving restoring gets implemented, define PCRE2_ERROR_BADENDIANNESS, and add -this comment and code: - -/* However, if the magic number is equal to REVERSED_MAGIC_NUMBER we return -with PCRE2_ERROR_BADENDIANNESS, which means that the pattern is likely compiled -with different endianness. */ - - return re->magic_number == REVERSED_MAGIC_NUMBER? - PCRE2_ERROR_BADENDIANNESS:PCRE2_ERROR_BADMAGIC; -#endif - /* Check the code unit width. */ if ((re->flags & PCRE2_MODE_MASK) != PCRE2_CODE_UNIT_WIDTH/8) diff --git a/src/pcre2_pattern_info.c b/src/pcre2_pattern_info.c index f9c9604..b743a11 100644 --- a/src/pcre2_pattern_info.c +++ b/src/pcre2_pattern_info.c @@ -110,18 +110,6 @@ return with PCRE2_ERROR_BADMAGIC. */ if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC; -#ifdef FIXME -If saving restoring gets implemented, define PCRE2_ERROR_BADENDIANNESS, and add -this comment and code: - -/* However, if the magic number is equal to REVERSED_MAGIC_NUMBER we return -with PCRE2_ERROR_BADENDIANNESS, which means that the pattern is likely compiled -with different endianness. */ - - return re->magic_number == REVERSED_MAGIC_NUMBER? - PCRE2_ERROR_BADENDIANNESS:PCRE2_ERROR_BADMAGIC; -#endif - /* Check that this pattern was compiled in the correct bit mode */ if ((re->flags & (PCRE2_CODE_UNIT_WIDTH/8)) == 0) return PCRE2_ERROR_BADMODE; diff --git a/src/pcre2test.c b/src/pcre2test.c index d935cb5..be460c3 100644 --- a/src/pcre2test.c +++ b/src/pcre2test.c @@ -651,6 +651,7 @@ static int timeit = 0; static int timeitm = 0; clock_t total_compile_time = 0; +clock_t total_jit_compile_time = 0; clock_t total_match_time = 0; static uint32_t dfa_matched; @@ -3933,23 +3934,22 @@ if ((pat_patctl.control & CTL_HEXPAT) == 0) patlen = PCRE2_ZERO_TERMINATED; if (timeit > 0) { register int i; - clock_t time_taken; - clock_t start_time = clock(); + clock_t time_taken = 0; for (i = 0; i < timeit; i++) { + clock_t start_time = clock(); PCRE2_COMPILE(compiled_code, pbuffer, patlen, pat_patctl.options|forbid_utf, &errorcode, &erroroffset, pat_context); + time_taken += clock() - start_time; if (TEST(compiled_code, !=, NULL)) { SUB1(pcre2_code_free, compiled_code); } } - total_compile_time += (time_taken = clock() - start_time); + total_compile_time += time_taken; fprintf(outfile, "Compile time %.4f milliseconds\n", (((double)time_taken * 1000.0) / (double)timeit) / (double)CLOCKS_PER_SEC); } -/* FIXME: implement timing for JIT compile. */ - /* A final compile that is used "for real". */ PCRE2_COMPILE(compiled_code, pbuffer, patlen, pat_patctl.options|forbid_utf, @@ -3974,11 +3974,35 @@ if (TEST(compiled_code, ==, NULL)) if (pattern_info(PCRE2_INFO_MAXLOOKBEHIND, &maxlookbehind, FALSE) != 0) return PR_ABEND; -/* Call the JIT compiler if requested. */ +/* Call the JIT compiler if requested. When timing, we must free and recompile +the pattern each time because that is the only way to free the JIT compiled +code. We know that compilation will always succeed. */ if (pat_patctl.jit != 0) { - PCRE2_JIT_COMPILE(compiled_code, pat_patctl.jit); + if (timeit > 0) + { + register int i; + clock_t time_taken = 0; + for (i = 0; i < timeit; i++) + { + clock_t start_time; + SUB1(pcre2_code_free, compiled_code); + PCRE2_COMPILE(compiled_code, pbuffer, patlen, + pat_patctl.options|forbid_utf, &errorcode, &erroroffset, pat_context); + start_time = clock(); + PCRE2_JIT_COMPILE(compiled_code, pat_patctl.jit); + time_taken += clock() - start_time; + } + total_jit_compile_time += time_taken; + fprintf(outfile, "JIT compile %.4f milliseconds\n", + (((double)time_taken * 1000.0) / (double)timeit) / + (double)CLOCKS_PER_SEC); + } + else + { + PCRE2_JIT_COMPILE(compiled_code, pat_patctl.jit); + } } /* Output code size and other information if requested. */ @@ -6290,14 +6314,20 @@ if (INTERACTIVE(infile)) fprintf(outfile, "\n"); if (showtotaltimes) { + const char *pad = ""; fprintf(outfile, "--------------------------------------\n"); if (timeit > 0) { fprintf(outfile, "Total compile time %.4f milliseconds\n", (((double)total_compile_time * 1000.0) / (double)timeit) / (double)CLOCKS_PER_SEC); + if (total_jit_compile_time > 0) + fprintf(outfile, "Total JIT compile %.4f milliseconds\n", + (((double)total_jit_compile_time * 1000.0) / (double)timeit) / + (double)CLOCKS_PER_SEC); + pad = " "; } - fprintf(outfile, "Total match time %.4f milliseconds\n", + fprintf(outfile, "Total match time %s%.4f milliseconds\n", pad, (((double)total_match_time * 1000.0) / (double)timeitm) / (double)CLOCKS_PER_SEC); }