-
Notifications
You must be signed in to change notification settings - Fork 0
/
stats.py
154 lines (102 loc) · 2.86 KB
/
stats.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
'''
TODO:
* add memory stats
* gc stats
'''
import time
def display_stats(stats_flag=0):
if stats_flag:
divider()
# evaluator stats
display_stack_stats()
display_fetch_stats()
display_label_stats()
display_dispatch_stats()
divider()
# system stats
display_read_stats()
display_run_time()
divider()
reset_stats()
def reset_stats():
for counter in COUNTERS:
COUNTERS[counter] = 0
def divider():
print('-' * 10)
COUNTERS = {
'number_of_saves': 0,
'curr_stack_depth': 0,
'max_stack_depth': 0,
'fetch_count': 0,
'labels_passed': 0,
'syntax_checks': 0,
'read_count': 0,
}
# stack stats
def display_stack_stats():
saves = COUNTERS['number_of_saves']
depth = COUNTERS['max_stack_depth']
print('Total saves:', saves)
print('Max stack depth:', depth)
def save_stats(save_func):
def save_wrapper(reg):
save_func(reg)
COUNTERS['number_of_saves'] += 1
COUNTERS['curr_stack_depth'] += 1
COUNTERS['max_stack_depth'] = max(
COUNTERS['curr_stack_depth'],
COUNTERS['max_stack_depth'])
return save_wrapper
def restore_stats(restore_func):
def restore_wrapper(reg):
restore_func(reg)
COUNTERS['curr_stack_depth'] -= 1
return restore_wrapper
# label stats
def display_label_stats():
labels = COUNTERS['labels_passed']
print('Labels passed:', labels)
def goto_stats(goto_func):
def goto_wrapper(label):
goto_func(label)
COUNTERS['labels_passed'] += 1
return goto_wrapper
# file i/o stats
def display_read_stats():
reads = COUNTERS['read_count']
print('Total file reads:', reads)
def read_stats(read_func):
def read_wrapper(reg, *args, **kwargs):
contents = read_func(reg, *args, **kwargs)
COUNTERS['read_count'] += 1
return contents
return read_wrapper
# run stats
def run_stats(run_func):
def run_wrapper(*args, **kwargs):
start = time.time()
run_func(*args, **kwargs)
elapsed = time.time() - start
COUNTERS['run_time'] = elapsed
return run_wrapper
def display_run_time():
run_time = COUNTERS['run_time']
print('Run-time:', run_time)
# dispatch stats
def dispatch_stats(dispatch_func):
def dispatch_wrapper(expr):
COUNTERS['syntax_checks'] += 1
return dispatch_func(expr)
return dispatch_wrapper
def display_dispatch_stats():
syntax_checks = COUNTERS['syntax_checks']
print('Syntax checks:', syntax_checks)
# register stats
def fetch_stats(fetch_func):
def fetch_wrapper(reg):
COUNTERS['fetch_count'] += 1
return fetch_func(reg)
return fetch_wrapper
def display_fetch_stats():
fetches = COUNTERS['fetch_count']
print('Total fetches:', fetches)