11
11
import os
12
12
import json
13
13
import sys
14
+ import timeit
14
15
15
- try :
16
- _clock = time .process_time
17
- except AttributeError :
18
- # Python 2.x does not have time.process_time
19
- _clock = time .clock
16
+ _clock = timeit .default_timer
20
17
21
18
22
19
from jmespath .parser import Parser
23
20
from jmespath .lexer import Lexer
24
21
25
22
26
23
DIRECTORY = os .path .join (os .path .dirname (os .path .abspath (__file__ )), 'cases' )
27
- DEFAULT_NUM_LOOP = 100
24
+ APPROX_RUN_TIME = 0.5
28
25
29
26
30
27
def run_tests (tests ):
@@ -47,50 +44,63 @@ def run_tests(tests):
47
44
48
45
49
46
def _lex_time (expression , clock = _clock ):
50
- best = float ('inf' )
51
47
lex = Lexer ()
52
- for i in range (DEFAULT_NUM_LOOP ):
48
+ duration = 0
49
+ i = 0
50
+ while True :
51
+ i += 1
53
52
start = clock ()
54
53
list (lex .tokenize (expression ))
55
54
end = clock ()
56
55
total = end - start
57
- if total < best :
58
- best = total
59
- return best
56
+ duration += total
57
+ if duration >= APPROX_RUN_TIME :
58
+ break
59
+ return duration / i
60
60
61
61
62
62
def _search_time (expression , given , clock = _clock ):
63
63
p = Parser ()
64
64
parsed = p .parse (expression )
65
- best = float ('inf' )
66
- for i in range (DEFAULT_NUM_LOOP ):
65
+ duration = 0
66
+ i = 0
67
+ while True :
68
+ i += 1
67
69
start = clock ()
68
70
parsed .search (given )
69
71
end = clock ()
70
72
total = end - start
71
- if total < best :
72
- best = total
73
- return best
73
+ duration += total
74
+ if duration >= APPROX_RUN_TIME :
75
+ break
76
+ return duration / i
74
77
75
78
76
79
def _parse_time (expression , clock = _clock ):
77
80
best = float ('inf' )
78
81
p = Parser ()
79
- for i in range (DEFAULT_NUM_LOOP ):
82
+ duration = 0
83
+ i = 0
84
+ while True :
85
+ i += 1
80
86
p .purge ()
81
87
start = clock ()
82
88
p .parse (expression )
83
89
end = clock ()
84
90
total = end - start
85
- if total < best :
86
- best = total
87
- return best
91
+ duration += total
92
+ if duration >= APPROX_RUN_TIME :
93
+ break
94
+ return duration / i
88
95
89
96
90
97
def _combined_time (expression , given , result , clock = _clock ):
91
98
best = float ('inf' )
92
99
p = Parser ()
93
- for i in range (DEFAULT_NUM_LOOP ):
100
+ duration = 0
101
+ i = 0
102
+ while True :
103
+ i += 1
94
104
p .purge ()
95
105
start = clock ()
96
106
r = p .parse (expression ).search (given )
@@ -99,9 +109,10 @@ def _combined_time(expression, given, result, clock=_clock):
99
109
if r != result :
100
110
raise RuntimeError ("Unexpected result, received: %s, "
101
111
"expected: %s" % (r , result ))
102
- if total < best :
103
- best = total
104
- return best
112
+ duration += total
113
+ if duration >= APPROX_RUN_TIME :
114
+ break
115
+ return duration / i
105
116
106
117
107
118
def load_tests (filename ):
0 commit comments