@@ -90,10 +90,91 @@ def subgroup(self):
9090
9191 def extraVmArgs (self ):
9292 extraVmArgs = super (JMHRunnerTruffleBenchmarkSuite , self ).extraVmArgs ()
93- # com.oracle .truffle.api .benchmark.InterpreterCallBenchmark$BenchmarkState needs DefaultTruffleRuntime
93+ # org.graalvm .truffle.benchmark.InterpreterCallBenchmark$BenchmarkState needs DefaultTruffleRuntime
9494 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' )
9597 return extraVmArgs
9698
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+
97178mx_benchmark .add_bm_suite (JMHRunnerTruffleBenchmarkSuite ())
98179#mx_benchmark.add_java_vm(mx_benchmark.DefaultJavaVm("server", "default"), priority=3)
99180
0 commit comments