source: proto/RE/performance/perf.py @ 3272

Last change on this file since 3272 was 3272, checked in by bhull, 6 years ago

RE perf script changes

File size: 6.5 KB
Line 
1from subprocess import call, Popen
2from collections import *
3import csv
4import StringIO
5import os.path
6import sys
7
8def execute(execution):
9        if not os.path.exists(execution.file.file+'.11'):
10                file = open(execution.file.file,'r')
11                contents = file.read()
12                file.close()
13                file11 = open(execution.file.file+'.11','w')
14                for i in range(11):
15                        file11.write(contents)
16                file11.close
17        if not os.path.exists(execution.file.file+'.5'):
18                file = open(execution.file.file,'r')
19                contents = file.read()
20                file.close()
21                file5 = open(execution.file.file+'.5','w')
22                for i in range(5):
23                        file5.write(contents)
24                file5.close
25
26        #quick version
27        one=execute_one(execution,1)
28        return one,one,one,one
29
30        #slower version
31        #execute_one(execution,1)
32        #one=execute_one(execution,10)
33        #execution5=Execution(execution.stat, execution.program, File(execution.file.file+'.5',execution.file.description+'.5',execution.file.types), execution.expression)
34        #execute_one(execution5,1)
35        #five=execute_one(execution5,10)
36        #execution11=Execution(execution.stat, execution.program, File(execution.file.file+'.11',execution.file.description+'.11',execution.file.types), execution.expression)
37        #execute_one(execution11,1)
38        #eleven=execute_one(execution11,10)
39        #return (eleven-one)/10,one,five/5,eleven/11
40
41
42
43
44def execute_one(execution, count):
45        log_file = open('perflog.txt', 'a')
46        log_file.write('\nEXECUTION: '+execution.file.description+' '+ execution.expression.description+' '+ execution.program+' '+ execution.stat+'\n')
47        log_file.close()
48        redirectoutput= ' >> perflog.txt 2>&1'
49        if execution.program=='bitstreams':
50               
51                re_home = '../'
52                re_input_file = open(re_home+'input/test/test1.re', 'w')
53                re_input_file.write(execution.expression.expression+'\n')
54                re_input_file.close()
55                call('make -C '+re_home + redirectoutput,shell=True)
56                call('make -C '+re_home+'output/' + redirectoutput,shell=True)
57                call('make -C '+re_home+'output/src/' + redirectoutput,shell=True)
58               
59                cmd = ['perf stat -x, -o perfoutput -r '+str(count)+' -e '+ execution.stat+ ' '+re_home+'output/src/re '+ execution.file.file + redirectoutput]
60                p = Popen(cmd,shell=True)
61                p.wait()
62        if execution.program=='grep':
63                cmd = ['perf stat -x, -o perfoutput -r '+str(count)+' -e '+ execution.stat+ ' grep -c -E \'' + execution.expression.expression + '\' '+ execution.file.file + redirectoutput]
64                p = Popen(cmd,shell=True)
65                p.wait()
66        if execution.program=='nrgrep':
67                nrgreplocation='nrgrep-1.0/nrgrep'
68                cmd = ['perf stat -x, -o perfoutput -r '+str(count)+' -e '+ execution.stat+ ' '+nrgreplocation+' -c \'' + execution.expression.expression + '\' '+ execution.file.file + redirectoutput]
69                p = Popen(cmd,shell=True)
70                p.wait()
71        if execution.program=='agrep':
72                agreplocation='agrep-3.41/agrep'
73                cmd = ['perf stat -x, -o perfoutput -r '+str(count)+' -e '+ execution.stat+ ' '+agreplocation+' -c \'' + execution.expression.expression + '\' '+ execution.file.file + redirectoutput]
74                p = Popen(cmd,shell=True)
75                p.wait()
76        output_file = open('perfoutput', 'r')
77        output = output_file.read()
78        endpos = output.rfind(execution.stat)-1
79        startpos=endpos-1
80        while output[startpos-1].isdigit():
81                startpos-=1
82        return int(output[startpos:endpos])
83               
84
85
86Expression = namedtuple('Expression', ['expression', 'description', 'types'])
87expressions = []
88File = namedtuple('File',['file','description','types'])
89files = []
90executions = []
91Execution = namedtuple('Execution', ['stat', 'program', 'file', 'expression'])
92
93
94
95
96
97
98#http://sljit.sourceforge.net/regex_perf.html
99files.append(File('data/mark.txt','data/mark.txt',('regex_perf',)))
100expressions.append(Expression('Twain', 'Twain', ('regex_perf',)))
101expressions.append(Expression('^Twain', '^Twain', ('regex_perf',)))
102expressions.append(Expression('Twain$', 'Twain$', ('regex_perf',)))
103expressions.append(Expression('Huck[a-zA-Z]+|Finn[a-zA-Z]+', 'Huck[a-zA-Z]+|Finn[a-zA-Z]+', ('regex_perf',)))
104expressions.append(Expression('a[^x]{20}b', 'a[^x]{20}b', ('regex_perf',)))
105expressions.append(Expression('Tom|Sawyer|Huckleberry|Finn', 'Tom|Sawyer|Huckleberry|Finn', ('regex_perf',)))
106expressions.append(Expression('.{0,3}(Tom|Sawyer|Huckleberry|Finn)', '.{0,3}(Tom|Sawyer|Huckleberry|Finn)', ('regex_perf',)))
107expressions.append(Expression('[a-zA-Z]+ing', '[a-zA-Z]+ing', ('regex_perf',)))
108expressions.append(Expression('^[a-zA-Z]{0,4}ing[^a-zA-Z]', '^[a-zA-Z]{0,4}ing[^a-zA-Z]', ('regex_perf',)))
109expressions.append(Expression('[a-zA-Z]+ing$', '[a-zA-Z]+ing$', ('regex_perf',)))
110expressions.append(Expression('^[a-zA-Z ]{5,}$', '^[a-zA-Z ]{5,}$', ('regex_perf',)))
111expressions.append(Expression('^.{16,20}$', '^.{16,20}$', ('regex_perf',)))
112expressions.append(Expression('([a-f](.[d-m].){0,2}[h-n]){2}', '([a-f](.[d-m].){0,2}[h-n]){2}', ('regex_perf',)))
113expressions.append(Expression('([A-Za-z]awyer|[A-Za-z]inn)[^a-zA-Z]', '([A-Za-z]awyer|[A-Za-z]inn)[^a-zA-Z]', ('regex_perf',)))
114expressions.append(Expression('"[^"]{0,30}[?!\.]"', '"[^"]{0,30}[?!\.]"', ('regex_perf',)))
115expressions.append(Expression('Tom.{10,25}river|river.{10,25}Tom', 'Tom.{10,25}river|river.{10,25}Tom', ('regex_perf',)))
116
117
118
119
120
121
122#http://lh3lh3.users.sourceforge.net/reb.shtml
123files.append(File('data/howto','howto',('reb',)))
124expressions.append(Expression('([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?', '([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?', ('reb',)))
125expressions.append(Expression('([^ @]+)@([^ @]+)', '([^ @]+)@([^ @]+)', ('reb',)))
126expressions.append(Expression('([0-9][0-9]?)/([0-9][0-9]?)/([0-9][0-9]([0-9][0-9])?)', '([0-9][0-9]?)/([0-9][0-9]?)/([0-9][0-9]([0-9][0-9])?)', ('reb',)))
127expressions.append(Expression('([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?|([^ @]+)@([^ @]+)', '([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?|([^ @]+)@([^ @]+)', ('reb',)))
128
129
130programs = ['bitstreams','grep','nrgrep','agrep']
131stats = ['cycles', 'instructions']
132
133typeargument=False
134if len(sys.argv)>1:
135        type=sys.argv[1]
136        typeargument=True
137
138for file in files:
139        for expression in expressions:
140                match = False
141                for type1 in file.types:
142                        for type2 in expression.types:
143                                if type1 == type2:
144                                        if typeargument:
145                                                if type1==type:
146                                                        match = True
147                                        else:
148                                                match = True
149                if match:
150                        for program in programs:
151                                for stat in stats:
152                                        executions.append(Execution(stat, program, file, expression))
153csv_output = StringIO.StringIO()
154writer = csv.writer(csv_output)
155
156log_file = open('perflog.txt', 'w')
157log_file.close()
158
159for execution in executions:
160        calc,one,five,eleven = execute(execution)
161        writer.writerow((execution.file.description, execution.expression.description, execution.program, execution.stat, calc,one,five,eleven))
162
163print csv_output.getvalue()
Note: See TracBrowser for help on using the repository browser.