@@ -90,10 +90,91 @@ def subgroup(self):
90
90
91
91
def extraVmArgs (self ):
92
92
extraVmArgs = super (JMHRunnerTruffleBenchmarkSuite , self ).extraVmArgs ()
93
- # com.oracle .truffle.api .benchmark.InterpreterCallBenchmark$BenchmarkState needs DefaultTruffleRuntime
93
+ # org.graalvm .truffle.benchmark.InterpreterCallBenchmark$BenchmarkState needs DefaultTruffleRuntime
94
94
extraVmArgs .append ('--add-exports=org.graalvm.truffle/com.oracle.truffle.api.impl=ALL-UNNAMED' )
95
+ # org.graalvm.truffle.compiler.benchmark.* needs OptimizedTruffleRuntime
96
+ extraVmArgs .append ('--add-exports=org.graalvm.truffle.runtime/com.oracle.truffle.runtime=ALL-UNNAMED' )
95
97
return extraVmArgs
96
98
99
+ def rules (self , out , benchmarks , bmSuiteArgs ):
100
+ result = super ().rules (out , benchmarks , bmSuiteArgs )
101
+ result_file = self .get_jmh_result_file (bmSuiteArgs )
102
+ suite_name = self .benchSuiteName (bmSuiteArgs )
103
+ result .extend ([
104
+ JMHJsonCompilationTimingRule (result_file , suite_name , "pe-time" ),
105
+ JMHJsonCompilationTimingRule (result_file , suite_name , "compile-time" ),
106
+ JMHJsonCompilationTimingRule (result_file , suite_name , "code-install-time" ),
107
+ ])
108
+ return result
109
+
110
+ class JMHJsonCompilationTimingRule (mx_benchmark .JMHJsonRule ):
111
+ def __init__ (self , filename , suite_name , metric_name ):
112
+ super ().__init__ (filename , suite_name )
113
+ self .metric_name = metric_name
114
+
115
+ def parse (self , text ):
116
+ r = []
117
+ with open (self ._prepend_working_dir (self .filename )) as fp :
118
+ for result in json .load (fp ):
119
+ benchmark = self .getBenchmarkNameFromResult (result )
120
+ metric = result .get ("secondaryMetrics" , {}).get (self .metric_name )
121
+ if metric is None :
122
+ return []
123
+
124
+ unit = JMHJsonCompilationTimingRule .standardize_unit (metric ["scoreUnit" ])
125
+
126
+ template = {
127
+ "bench-suite" : self .suiteName ,
128
+ "benchmark" : self .shortenPackageName (benchmark ),
129
+ "metric.unit" : unit ,
130
+ "metric.score-function" : "id" ,
131
+ "metric.better" : "lower" ,
132
+ "metric.type" : "numeric" ,
133
+ # full name
134
+ "extra.jmh.benchmark" : benchmark ,
135
+ }
136
+
137
+ if "params" in result :
138
+ # add all parameter as a single string
139
+ template ["extra.jmh.params" ] = ", " .join (["=" .join (kv ) for kv in result ["params" ].items ()])
140
+ # and also the individual values
141
+ for k , v in result ["params" ].items ():
142
+ template ["extra.jmh.param." + k ] = str (v )
143
+
144
+ for k in self .getExtraJmhKeys ():
145
+ extra_value = None
146
+ if k in result :
147
+ extra_value = result [k ]
148
+ template ["extra.jmh." + k ] = str (extra_value )
149
+
150
+
151
+ summary_datapoint = template .copy ()
152
+ summary_datapoint .update ({
153
+ "metric.name" : self .metric_name ,
154
+ "metric.value" : float (metric ["score" ])
155
+ })
156
+ r .append (summary_datapoint )
157
+
158
+ score_percentiles = metric .get ("scorePercentiles" )
159
+ if score_percentiles :
160
+ distribution_metric_name = f"{ self .metric_name } -distribution"
161
+ for percentile , score in score_percentiles .items ():
162
+ percentile_datapoint = template .copy ()
163
+ percentile_datapoint .update ({
164
+ "metric.name" : distribution_metric_name ,
165
+ "metric.value" : float (score ),
166
+ "metric.percentile" : float (percentile )
167
+ })
168
+ r .append (percentile_datapoint )
169
+ return r
170
+
171
+ @staticmethod
172
+ def standardize_unit (unit : str ) -> str :
173
+ if unit .endswith ("/op" ):
174
+ # JMH emits timings "per operation", e.g., "ms/op". Drop the suffix.
175
+ return unit [:- len ("/op" )]
176
+ return unit
177
+
97
178
mx_benchmark .add_bm_suite (JMHRunnerTruffleBenchmarkSuite ())
98
179
#mx_benchmark.add_java_vm(mx_benchmark.DefaultJavaVm("server", "default"), priority=3)
99
180
0 commit comments