From 8c0d65c43cf914bbed21a54a511da21bc450aa17 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 30 Oct 2025 15:08:49 -0400 Subject: [PATCH 1/9] Update notebooks to work with any benchmark parameters --- examples/compare-benchmark-runs.ipynb | 1372 +++++++------ examples/simple-benchmark-analysis.ipynb | 2325 +++++++++------------- 2 files changed, 1688 insertions(+), 2009 deletions(-) diff --git a/examples/compare-benchmark-runs.ipynb b/examples/compare-benchmark-runs.ipynb index 24d675ac..832fbae3 100644 --- a/examples/compare-benchmark-runs.ipynb +++ b/examples/compare-benchmark-runs.ipynb @@ -24,10 +24,6 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:36.539161Z", - "start_time": "2025-10-15T06:52:32.150691Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_2_jupyter", @@ -45,23 +41,27 @@ "Line_14_jupyter", "Line_15_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:24.159142Z", + "start_time": "2025-10-30T19:07:15.312266Z" } }, "cell_type": "code", "source": "%use serialization, dataframe, kandy", "outputs": [], - "execution_count": 1 + "execution_count": 22 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:36.792711Z", - "start_time": "2025-10-15T06:52:36.540356Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_16_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:24.233302Z", + "start_time": "2025-10-30T19:07:24.163353Z" } }, "cell_type": "code", @@ -83,14 +83,10 @@ " .map { it.resolve(\"jvm.json\") }" ], "outputs": [], - "execution_count": 2 + "execution_count": 23 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:37.905784Z", - "start_time": "2025-10-15T06:52:36.794274Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_17_jupyter", @@ -99,6 +95,10 @@ "Line_20_jupyter", "Line_21_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:24.612683Z", + "start_time": "2025-10-30T19:07:24.236488Z" } }, "cell_type": "code", @@ -108,14 +108,10 @@ "val oldRun = outputFiles.last().readText().deserializeJson()" ], "outputs": [], - "execution_count": 3 + "execution_count": 24 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:38.536966Z", - "start_time": "2025-10-15T06:52:37.906464Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_22_jupyter", @@ -124,6 +120,10 @@ "Line_25_jupyter", "Line_26_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:25.009062Z", + "start_time": "2025-10-30T19:07:24.650840Z" } }, "cell_type": "code", @@ -136,20 +136,20 @@ "val newDf = newRun.toDataFrame().addId(\"rowIndex\")" ], "outputs": [], - "execution_count": 4 + "execution_count": 25 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:38.914275Z", - "start_time": "2025-10-15T06:52:38.543089Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_27_jupyter", "Line_28_jupyter", "Line_29_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:25.123632Z", + "start_time": "2025-10-30T19:07:25.016577Z" } }, "cell_type": "code", @@ -159,28 +159,41 @@ "// combinedData" ], "outputs": [], - "execution_count": 5 + "execution_count": 26 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:39.257941Z", - "start_time": "2025-10-15T06:52:38.915574Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_30_jupyter", "Line_31_jupyter", "Line_32_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:25.428102Z", + "start_time": "2025-10-30T19:07:25.128964Z" } }, "cell_type": "code", "source": [ + "import kotlinx.serialization.json.encodeToJsonElement\n", + "\n", "// Reduce the combined data into the exact format we need\n", "val resultData = combinedData.mapToFrame {\n", " \"name\" from { it.benchmark }\n", - " \"params\" from { it.params?.let { params -> \"data=${params.data},text=\\\"${params.text}\\\",value=${params.value}\"} ?: \"\" }\n", + " \"params\" from {\n", + " if (it.params != null) {\n", + " Json.decodeFromJsonElement>(Json.encodeToJsonElement(it.params))\n", + " .entries\n", + " .filter { it.value != null }\n", + " .sortedBy { it.key }\n", + " .map { \"${it.key}=${it.value}\" }\n", + " .joinToString(\",\")\n", + " } else {\n", + " \"\"\n", + " }\n", + " }\n", " \"mode\" from { it.mode } // \"avgt\" or \"thrpt\"\n", " \"unit\" from { it.primaryMetric.scoreUnit }\n", " \"runOld\" {\n", @@ -196,20 +209,20 @@ "// resultData" ], "outputs": [], - "execution_count": 6 + "execution_count": 27 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:39.400795Z", - "start_time": "2025-10-15T06:52:39.259607Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_33_jupyter", "Line_34_jupyter", "Line_35_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:25.502050Z", + "start_time": "2025-10-30T19:07:25.433755Z" } }, "cell_type": "code", @@ -220,20 +233,20 @@ "// mergedData" ], "outputs": [], - "execution_count": 7 + "execution_count": 28 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:39.899417Z", - "start_time": "2025-10-15T06:52:39.403744Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_36_jupyter", "Line_37_jupyter", "Line_38_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:25.748428Z", + "start_time": "2025-10-30T19:07:25.516603Z" } }, "cell_type": "code", @@ -276,7 +289,7 @@ { "data": { "text/html": [ - " \n", " \n", " " ], - "application/kotlindataframe+json": "{\"$version\":\"2.2.0\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12,\"is_formatted\":false},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1124169.302037032,\"range\":\"1048963.3505892197..1199375.2534848445\",\"score1\":1104972.6706894366,\"range1\":\"1055663.3534587221..1154281.987920151\",\"diffScore\":-19196.63134759548,\"diffScorePercentage\":-1.7076281404242712,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4563056890183368E8,\"range\":\"1.4257469243792653E8..1.4868644536574084E8\",\"score1\":1.4634989745609665E8,\"range1\":\"1.437328117109918E8..1.489669832012015E8\",\"diffScore\":719328.5542629659,\"diffScorePercentage\":0.4939406332662542,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":215040.42648766268,\"range\":\"209159.44934415395..220921.40363117142\",\"score1\":213019.57841385395,\"range1\":\"204650.0532153221..221389.10361238578\",\"diffScore\":-2020.8480738087383,\"diffScorePercentage\":-0.9397526348026837,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":216167.94947592515,\"range\":\"209816.26197479176..222519.63697705854\",\"score1\":214917.7241256119,\"range1\":\"208616.32754332913..221219.12070789465\",\"diffScore\":-1250.225350313267,\"diffScorePercentage\":-0.5783583335754896,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":102937.09492915806,\"range\":\"102198.8667788953..103675.32307942082\",\"score1\":102424.75929129767,\"range1\":\"101113.46667154715..103736.05191104818\",\"diffScore\":-512.335637860393,\"diffScorePercentage\":-0.4977172108975735,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":103082.84485602807,\"range\":\"102746.60675391225..103419.08295814389\",\"score1\":101173.75249296638,\"range1\":\"99908.94648785368..102438.55849807907\",\"diffScore\":-1909.092363061689,\"diffScorePercentage\":-1.8519981338583025,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2672623.9977166834,\"range\":\"2581766.221460874..2763481.7739724927\",\"score1\":2680506.786160648,\"range1\":\"2646872.2297869264..2714141.3425343693\",\"diffScore\":7882.78844396444,\"diffScorePercentage\":0.2949456583005684,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2654913.2949247262,\"range\":\"2530927.3446583785..2778899.245191074\",\"score1\":2585022.6644677366,\"range1\":\"2454777.568459309..2715267.760476164\",\"diffScore\":-69890.63045698963,\"diffScorePercentage\":-2.6325014301068244,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2676852.389264137,\"range\":\"2585653.063020375..2768051.715507899\",\"score1\":2614856.4118722673,\"range1\":\"2580741.3402635106..2648971.483481024\",\"diffScore\":-61995.97739186976,\"diffScorePercentage\":-2.3160028412665805,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2676496.83515426,\"range\":\"2585056.261771287..2767937.4085372332\",\"score1\":2585237.244524414,\"range1\":\"2552358.4905912033..2618115.998457625\",\"diffScore\":-91259.59062984586,\"diffScorePercentage\":-3.409665553540104,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155929.81523562223,\"range\":\"155267.27942953032..156592.35104171414\",\"score1\":150449.20912261767,\"range1\":\"147414.465281937..153483.95296329833\",\"diffScore\":-5480.606113004556,\"diffScorePercentage\":-3.5147903591900813,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":156259.91933032282,\"range\":\"155967.2972273164..156552.54143332926\",\"score1\":147058.56562691744,\"range1\":\"140116.58313969668..154000.5481141382\",\"diffScore\":-9201.353703405388,\"diffScorePercentage\":-5.888492546802327,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155811.88330649625,\"range\":\"154012.99823010628..157610.76838288622\",\"score1\":146125.99724354869,\"range1\":\"143504.1570471993..148747.83743989808\",\"diffScore\":-9685.886062947568,\"diffScorePercentage\":-6.216397528482819,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":154835.23402865283,\"range\":\"152299.566575624..157370.90148168168\",\"score1\":150019.93211383233,\"range1\":\"145881.2852993276..154158.57892833705\",\"diffScore\":-4815.301914820506,\"diffScorePercentage\":-3.109952295437753,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":149758.67842734433,\"range\":\"149465.14095246932..150052.21590221935\",\"score1\":145509.90114707965,\"range1\":\"143242.89296995336..147776.90932420595\",\"diffScore\":-4248.77728026468,\"diffScorePercentage\":-2.8370825149381784,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":8.442082734074419E-4,\"range\":\"8.372522775198425E-4..8.511642692950413E-4\",\"score1\":8.972137714852465E-4,\"range1\":\"8.737790976669418E-4..9.206484453035511E-4\",\"diffScore\":-5.3005498077804544E-5,\"diffScorePercentage\":-6.278722887168673,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.1647588413775662E-5,\"range\":\"2.1394152325114E-5..2.1901024502437323E-5\",\"score1\":2.369188528309145E-5,\"range1\":\"2.3161777788037864E-5..2.4221992778145036E-5\",\"diffScore\":-2.044296869315788E-6,\"diffScorePercentage\":-9.443531677712787,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":6.6933720644037785E-6,\"range\":\"6.650531071713415E-6..6.736213057094142E-6\",\"score1\":6.7916806977233165E-6,\"range1\":\"6.710269330854009E-6..6.8730920645926235E-6\",\"diffScore\":-9.830863331953794E-8,\"diffScorePercentage\":-1.4687459829456666,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.472485344175375,\"range\":\"3.4596934638924464..3.485277224458304\",\"score1\":3.5445401759264423,\"range1\":\"3.5170213910539556..3.572058960798929\",\"diffScore\":-0.0720548317510672,\"diffScorePercentage\":-2.075021911091128,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5348082435809666,\"range\":\"0.5300538318352048..0.5395626553267283\",\"score1\":0.5428283650466172,\"range1\":\"0.5388189143575554..0.5468378157356791\",\"diffScore\":-0.008020121465650676,\"diffScorePercentage\":-1.4996256250557365,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" + "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1053176.103331759,\"range\":\"1014444.6854321724..1091907.5212313458\",\"score1\":999715.5730582711,\"range1\":\"974954.2809652109..1024476.8651513313\",\"diffScore\":-53460.530273488024,\"diffScorePercentage\":-5.076124506088183,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4053714460364798E8,\"range\":\"1.3690787959174788E8..1.4416640961554807E8\",\"score1\":1.3251985400275281E8,\"range1\":\"1.2936737342079675E8..1.3567233458470887E8\",\"diffScore\":-8017290.600895166,\"diffScorePercentage\":-5.704748465970368,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208887.0803288155,\"range\":\"207898.89918554123..209875.26147208977\",\"score1\":196902.03613375648,\"range1\":\"191654.7423267418..202149.32994077116\",\"diffScore\":-11985.044195059018,\"diffScorePercentage\":-5.737570833099392,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208677.3206090656,\"range\":\"208062.74007314906..209291.9011449821\",\"score1\":198982.020454078,\"range1\":\"194497.3197739599..203466.72113419612\",\"diffScore\":-9695.300154987577,\"diffScorePercentage\":-4.646072762813873,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83625.73898681287,\"range\":\"83088.20039438509..84163.27757924065\",\"score1\":76487.5086281744,\"range1\":\"74595.04831374026..78379.96894260854\",\"diffScore\":-7138.230358638466,\"diffScorePercentage\":-8.535924997642304,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83718.3177697431,\"range\":\"83169.61975110027..84267.01578838592\",\"score1\":77218.5368951281,\"range1\":\"75599.16372724227..78837.91006301393\",\"diffScore\":-6499.780874614997,\"diffScorePercentage\":-7.763869422808808,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2540370.5762627637,\"range\":\"2288100.709941338..2792640.4425841896\",\"score1\":2312642.7736440543,\"range1\":\"2091779.438724716..2533506.1085633924\",\"diffScore\":-227727.8026187094,\"diffScorePercentage\":-8.964353655588646,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2566945.3411485883,\"range\":\"2360770.956540762..2773119.7257564147\",\"score1\":2295922.9388216315,\"range1\":\"2089935.2366487498..2501910.6409945134\",\"diffScore\":-271022.40232695686,\"diffScorePercentage\":-10.55816802884034,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2623681.4037052076,\"range\":\"2551535.491785763..2695827.3156246524\",\"score1\":2295223.3640071456,\"range1\":\"2115768.594299648..2474678.1337146433\",\"diffScore\":-328458.039698062,\"diffScorePercentage\":-12.51897578853164,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2540686.802958132,\"range\":\"2452532.053305992..2628841.5526102716\",\"score1\":2295128.5932107824,\"range1\":\"2082445.0002591067..2507812.186162458\",\"diffScore\":-245558.20974734938,\"diffScorePercentage\":-9.665032677835182,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147875.3323979754,\"range\":\"147061.31984741875..148689.34494853206\",\"score1\":139497.9818106305,\"range1\":\"135894.93943472698..143101.02418653402\",\"diffScore\":-8377.350587344903,\"diffScorePercentage\":-5.665144044984475,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148182.79464984537,\"range\":\"147312.38741453286..149053.20188515788\",\"score1\":139472.55121529553,\"range1\":\"135249.9703875965..143695.13204299458\",\"diffScore\":-8710.243434549833,\"diffScorePercentage\":-5.878039657122179,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148010.5612362782,\"range\":\"147183.62506193086..148837.49741062557\",\"score1\":137951.95168809665,\"range1\":\"133789.3696336104..142114.53374258292\",\"diffScore\":-10058.609548181557,\"diffScorePercentage\":-6.795872851346324,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147818.34957610376,\"range\":\"146603.6094475876..149033.08970461992\",\"score1\":135829.98563075942,\"range1\":\"131190.7048701939..140469.26639132493\",\"diffScore\":-11988.363945344347,\"diffScorePercentage\":-8.110200106903628,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":141910.35376521535,\"range\":\"141167.25628010757..142653.45125032312\",\"score1\":133932.19330461326,\"range1\":\"129878.2239827778..137986.16262644873\",\"diffScore\":-7978.160460602085,\"diffScorePercentage\":-5.621972075273389,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":9.316604268061413E-4,\"range\":\"9.238695011656973E-4..9.394513524465853E-4\",\"score1\":0.0010203532398568873,\"range1\":\"9.902780506238168E-4..0.0010504284290899577\",\"diffScore\":-8.8692813050746E-5,\"diffScorePercentage\":-9.519864802543674,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.4255527187620338E-5,\"range\":\"2.408636087672226E-5..2.4424693498518416E-5\",\"score1\":2.6287927694751805E-5,\"range1\":\"2.5596365181913836E-5..2.6979490207589775E-5\",\"diffScore\":-2.0324005071314676E-6,\"diffScorePercentage\":-8.379123205241132,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":7.074449573732205E-6,\"range\":\"7.049360189172837E-6..7.099538958291572E-6\",\"score1\":7.614962302484078E-6,\"range1\":\"7.456424871291536E-6..7.77349973367662E-6\",\"diffScore\":-5.405127287518736E-7,\"diffScorePercentage\":-7.640350293241543,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.659870901180189,\"range\":\"3.651226166681157..3.6685156356792206\",\"score1\":3.9713384641892873,\"range1\":\"3.8358525869703075..4.1068243414082675\",\"diffScore\":-0.3114675630090984,\"diffScorePercentage\":-8.510342889653847,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5616297575188567,\"range\":\"0.5582725986585425..0.5649869163791709\",\"score1\":0.6065983726836912,\"range1\":\"0.5901377228601924..0.62305902250719\",\"diffScore\":-0.044968615164834524,\"diffScorePercentage\":-8.00680778801588,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" }, - "execution_count": 8, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 8 + "execution_count": 29 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:40.654419Z", - "start_time": "2025-10-15T06:52:39.985683Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_40_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:25.948197Z", + "start_time": "2025-10-30T19:07:25.777017Z" } }, "cell_type": "code", "source": [ "import org.jetbrains.kotlinx.kandy.util.color.Color\n", "import org.jetbrains.letsPlot.core.spec.plotson.fill\n", - "import org.jetbrains.letsPlot.core.spec.plotson.format\n", - "import org.jetbrains.letsPlot.core.spec.plotson.title\n", "import org.jetbrains.letsPlot.label.ggtitle\n", "import org.jetbrains.letsPlot.scale.guideLegend\n", "import org.jetbrains.letsPlot.scale.guides\n", @@ -1010,47 +1021,23 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " -12\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -10\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " -8\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -6\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -4\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=2,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=1,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=1,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=2,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=2,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.cosBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.nested.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBlackholeBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=1,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=2,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.sqrtBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.cosBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=2,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.baseBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.sqrtBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=1,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.inheritedBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=1,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=2,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " test.nested.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=1,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.baseBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.inheritedBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1638,9 +1592,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " Diff %\n", " \n", @@ -1648,10 +1605,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1659,48 +1616,48 @@ "mapping": {}, "data": { "testLabel": [ - "test.CommonBenchmark.longBlackholeBenchmark", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", "test.CommonBenchmark.longBenchmark", - "test.ParamBenchmark.textContentCheck\n[data=2,text=\"a \"string\" with quotes\",value=1]", - "test.ParamBenchmark.textContentCheck\n[data=1,text=\"a \"string\" with quotes\",value=2]", - "test.ParamBenchmark.textContentCheck\n[data=1,text=\"a \"string\" with quotes\",value=1]", - "test.ParamBenchmark.otherBenchmark\n[data=2,text=\"a \"string\" with quotes\",value=2]", - "test.ParamBenchmark.textContentCheck\n[data=2,text=\"a \"string\" with quotes\",value=2]", - "test.nested.CommonBenchmark.mathBenchmark", - "test.ParamBenchmark.otherBenchmark\n[data=1,text=\"a \"string\" with quotes\",value=2]", - "test.ParamBenchmark.otherBenchmark\n[data=2,text=\"a \"string\" with quotes\",value=1]", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", "test.JvmTestBenchmark.cosBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=\"a \"string\" with quotes\",value=2]", - "test.InheritedBenchmark.baseBenchmark", + "test.CommonBenchmark.longBlackholeBenchmark", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", "test.JvmTestBenchmark.sqrtBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", "test.CommonBenchmark.mathBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=\"a \"string\" with quotes\",value=1]", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=\"a \"string\" with quotes\",value=2]", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=\"a \"string\" with quotes\",value=1]", - "test.ParamBenchmark.otherBenchmark\n[data=1,text=\"a \"string\" with quotes\",value=1]", - "test.InheritedBenchmark.inheritedBenchmark" + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", + "test.InheritedBenchmark.inheritedBenchmark", + "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=1]", + "test.nested.CommonBenchmark.mathBenchmark", + "test.InheritedBenchmark.baseBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]" ], "diffScorePercentage": [ - -9.443531677712787, - -6.278722887168673, - -6.216397528482819, - -5.888492546802327, - -3.5147903591900813, - -3.409665553540104, - -3.109952295437753, - -2.8370825149381784, - -2.6325014301068244, - -2.3160028412665805, - -2.075021911091128, - -1.8519981338583025, - -1.7076281404242712, - -1.4996256250557365, - -1.4687459829456666, - -0.9397526348026837, - -0.5783583335754896, - -0.4977172108975735, - 0.2949456583005684, - 0.4939406332662542 + -12.51897578853164, + -10.55816802884034, + -9.665032677835182, + -9.519864802543674, + -8.964353655588646, + -8.535924997642304, + -8.510342889653847, + -8.379123205241132, + -8.110200106903628, + -8.00680778801588, + -7.763869422808808, + -7.640350293241543, + -6.795872851346324, + -5.878039657122179, + -5.737570833099392, + -5.704748465970368, + -5.665144044984475, + -5.621972075273389, + -5.076124506088183, + -4.646072762813873 ], "barColor": [ "neg", @@ -1721,8 +1678,8 @@ "neg", "neg", "neg", - "pos", - "pos" + "neg", + "neg" ] }, "ggsize": { @@ -1819,23 +1776,23 @@ "swing_enabled": true } }, - "execution_count": 9, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 9 + "execution_count": 30 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:40.787999Z", - "start_time": "2025-10-15T06:52:40.667895Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_41_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:26.110424Z", + "start_time": "2025-10-30T19:07:26.058517Z" } }, "cell_type": "code", @@ -1858,7 +1815,7 @@ { "data": { "text/html": [ - " \n", " \n", - "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.ParamBenchmark.mathBenchmarkdata=2,text="a "string" with quotes",...thrptops/ms103082.844856102746.60675391225..103419.08295814389101173.75249399908.94648785368..102438.55849807907-1909.092363-1.851998test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.textContentCheckdata=1,text="a "string" with quotes",...thrptops/ms155929.815236155267.27942953032..156592.35104171414150449.209123147414.465281937..153483.95296329833-5480.606113-3.514790test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=1,text="a "string" with quotes",...thrptops/ms156259.919330155967.2972273164..156552.54143332926147058.565627140116.58313969668..154000.5481141382-9201.353703-5.888493test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=2,text="a "string" with quotes",...thrptops/ms155811.883306154012.99823010628..157610.76838288622146125.997244143504.1570471993..148747.83743989808-9685.886063-6.216398test.ParamBenchmark.textContentCheck\n", - "...neg
test.nested.CommonBenchmark.mathBench...thrptops/ms149758.678427149465.14095246932..150052.21590221935145509.901147143242.89296995336..147776.90932420595-4248.777280-2.837083test.nested.CommonBenchmark.mathBench...neg
test.CommonBenchmark.longBenchmarkavgtms/op0.0008448.372522775198425E-4..8.5116426929504...0.0008978.737790976669418E-4..9.2064844530355...-0.000053-6.278723test.CommonBenchmark.longBenchmarkneg
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000222.1394152325114E-5..2.190102450243732...0.0000242.3161777788037864E-5..2.422199277814...-0.000002-9.443532test.CommonBenchmark.longBlackholeBen...neg
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.4724853.4596934638924464..3.4852772244583043.5445403.5170213910539556..3.572058960798929-0.072055-2.075022test.JvmTestBenchmark.cosBenchmarkneg
\n", + "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.InheritedBenchmark.inheritedBenc...thrptops/s140537144.6036481.3690787959174788E8..1.4416640961554...132519854.0027531.2936737342079675E8..1.3567233458470...-8017290.600895-5.704748test.InheritedBenchmark.inheritedBenc...neg
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms208887.080329207898.89918554123..209875.26147208977196902.036134191654.7423267418..202149.32994077116-11985.044195-5.737571test.ParamBenchmark.mathBenchmark\n", + "[da...neg
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms208677.320609208062.74007314906..209291.9011449821198982.020454194497.3197739599..203466.72113419612-9695.300155-4.646073test.ParamBenchmark.mathBenchmark\n", + "[da...neg
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms83625.73898783088.20039438509..84163.2775792406576487.50862874595.04831374026..78379.96894260854-7138.230359-8.535925test.ParamBenchmark.mathBenchmark\n", + "[da...neg
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms83718.31777083169.61975110027..84267.0157883859277218.53689575599.16372724227..78837.91006301393-6499.780875-7.763869test.ParamBenchmark.mathBenchmark\n", + "[da...neg
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2623681.4037052551535.491785763..2695827.31562465242295223.3640072115768.594299648..2474678.1337146433-328458.039698-12.518976test.ParamBenchmark.otherBenchmark\n", + "[d...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms147875.332398147061.31984741875..148689.34494853206139497.981811135894.93943472698..143101.02418653402-8377.350587-5.665144test.ParamBenchmark.textContentCheck\n", + "...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms148182.794650147312.38741453286..149053.20188515788139472.551215135249.9703875965..143695.13204299458-8710.243435-5.878040test.ParamBenchmark.textContentCheck\n", + "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms148010.561236147183.62506193086..148837.49741062557137951.951688133789.3696336104..142114.53374258292-10058.609548-6.795873test.ParamBenchmark.textContentCheck\n", + "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms147818.349576146603.6094475876..149033.08970461992135829.985631131190.7048701939..140469.26639132493-11988.363945-8.110200test.ParamBenchmark.textContentCheck\n", + "...neg
test.nested.CommonBenchmark.mathBench...thrptops/ms141910.353765141167.25628010757..142653.45125032312133932.193305129878.2239827778..137986.16262644873-7978.160461-5.621972test.nested.CommonBenchmark.mathBench...neg
test.CommonBenchmark.longBenchmarkavgtms/op0.0009329.238695011656973E-4..9.3945135244658...0.0010209.902780506238168E-4..0.0010504284290...-0.000089-9.519865test.CommonBenchmark.longBenchmarkneg
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000242.408636087672226E-5..2.4424693498518...0.0000262.5596365181913836E-5..2.697949020758...-0.000002-8.379123test.CommonBenchmark.longBlackholeBen...neg
test.CommonBenchmark.mathBenchmarkavgtms/op0.0000077.049360189172837E-6..7.0995389582915...0.0000087.456424871291536E-6..7.7734997336766...-0.000001-7.640350test.CommonBenchmark.mathBenchmarkneg
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.6598713.651226166681157..3.66851563567922063.9713383.8358525869703075..4.1068243414082675-0.311468-8.510343test.JvmTestBenchmark.cosBenchmarkneg
test.JvmTestBenchmark.sqrtBenchmarkavgtns/op0.5616300.5582725986585425..0.56498691637917090.6065980.5901377228601924..0.62305902250719-0.044969-8.006808test.JvmTestBenchmark.sqrtBenchmarkneg
\n", " \n", " \n", " " ], - "application/kotlindataframe+json": "{\"$version\":\"2.2.0\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":8,\"ncol\":12,\"is_formatted\":false},\"kotlin_dataframe\":[{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":103082.84485602807,\"range\":\"102746.60675391225..103419.08295814389\",\"score1\":101173.75249296638,\"range1\":\"99908.94648785368..102438.55849807907\",\"diffScore\":-1909.092363061689,\"diffScorePercentage\":-1.8519981338583025,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155929.81523562223,\"range\":\"155267.27942953032..156592.35104171414\",\"score1\":150449.20912261767,\"range1\":\"147414.465281937..153483.95296329833\",\"diffScore\":-5480.606113004556,\"diffScorePercentage\":-3.5147903591900813,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":156259.91933032282,\"range\":\"155967.2972273164..156552.54143332926\",\"score1\":147058.56562691744,\"range1\":\"140116.58313969668..154000.5481141382\",\"diffScore\":-9201.353703405388,\"diffScorePercentage\":-5.888492546802327,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=\\\"a \\\"string\\\" with quotes\\\",value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155811.88330649625,\"range\":\"154012.99823010628..157610.76838288622\",\"score1\":146125.99724354869,\"range1\":\"143504.1570471993..148747.83743989808\",\"diffScore\":-9685.886062947568,\"diffScorePercentage\":-6.216397528482819,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=\\\"a \\\"string\\\" with quotes\\\",value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":149758.67842734433,\"range\":\"149465.14095246932..150052.21590221935\",\"score1\":145509.90114707965,\"range1\":\"143242.89296995336..147776.90932420595\",\"diffScore\":-4248.77728026468,\"diffScorePercentage\":-2.8370825149381784,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":8.442082734074419E-4,\"range\":\"8.372522775198425E-4..8.511642692950413E-4\",\"score1\":8.972137714852465E-4,\"range1\":\"8.737790976669418E-4..9.206484453035511E-4\",\"diffScore\":-5.3005498077804544E-5,\"diffScorePercentage\":-6.278722887168673,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.1647588413775662E-5,\"range\":\"2.1394152325114E-5..2.1901024502437323E-5\",\"score1\":2.369188528309145E-5,\"range1\":\"2.3161777788037864E-5..2.4221992778145036E-5\",\"diffScore\":-2.044296869315788E-6,\"diffScorePercentage\":-9.443531677712787,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.472485344175375,\"range\":\"3.4596934638924464..3.485277224458304\",\"score1\":3.5445401759264423,\"range1\":\"3.5170213910539556..3.572058960798929\",\"diffScore\":-0.0720548317510672,\"diffScorePercentage\":-2.075021911091128,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"}]}" + "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":16,\"ncol\":12},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4053714460364798E8,\"range\":\"1.3690787959174788E8..1.4416640961554807E8\",\"score1\":1.3251985400275281E8,\"range1\":\"1.2936737342079675E8..1.3567233458470887E8\",\"diffScore\":-8017290.600895166,\"diffScorePercentage\":-5.704748465970368,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208887.0803288155,\"range\":\"207898.89918554123..209875.26147208977\",\"score1\":196902.03613375648,\"range1\":\"191654.7423267418..202149.32994077116\",\"diffScore\":-11985.044195059018,\"diffScorePercentage\":-5.737570833099392,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208677.3206090656,\"range\":\"208062.74007314906..209291.9011449821\",\"score1\":198982.020454078,\"range1\":\"194497.3197739599..203466.72113419612\",\"diffScore\":-9695.300154987577,\"diffScorePercentage\":-4.646072762813873,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83625.73898681287,\"range\":\"83088.20039438509..84163.27757924065\",\"score1\":76487.5086281744,\"range1\":\"74595.04831374026..78379.96894260854\",\"diffScore\":-7138.230358638466,\"diffScorePercentage\":-8.535924997642304,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83718.3177697431,\"range\":\"83169.61975110027..84267.01578838592\",\"score1\":77218.5368951281,\"range1\":\"75599.16372724227..78837.91006301393\",\"diffScore\":-6499.780874614997,\"diffScorePercentage\":-7.763869422808808,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2623681.4037052076,\"range\":\"2551535.491785763..2695827.3156246524\",\"score1\":2295223.3640071456,\"range1\":\"2115768.594299648..2474678.1337146433\",\"diffScore\":-328458.039698062,\"diffScorePercentage\":-12.51897578853164,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147875.3323979754,\"range\":\"147061.31984741875..148689.34494853206\",\"score1\":139497.9818106305,\"range1\":\"135894.93943472698..143101.02418653402\",\"diffScore\":-8377.350587344903,\"diffScorePercentage\":-5.665144044984475,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148182.79464984537,\"range\":\"147312.38741453286..149053.20188515788\",\"score1\":139472.55121529553,\"range1\":\"135249.9703875965..143695.13204299458\",\"diffScore\":-8710.243434549833,\"diffScorePercentage\":-5.878039657122179,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148010.5612362782,\"range\":\"147183.62506193086..148837.49741062557\",\"score1\":137951.95168809665,\"range1\":\"133789.3696336104..142114.53374258292\",\"diffScore\":-10058.609548181557,\"diffScorePercentage\":-6.795872851346324,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147818.34957610376,\"range\":\"146603.6094475876..149033.08970461992\",\"score1\":135829.98563075942,\"range1\":\"131190.7048701939..140469.26639132493\",\"diffScore\":-11988.363945344347,\"diffScorePercentage\":-8.110200106903628,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":141910.35376521535,\"range\":\"141167.25628010757..142653.45125032312\",\"score1\":133932.19330461326,\"range1\":\"129878.2239827778..137986.16262644873\",\"diffScore\":-7978.160460602085,\"diffScorePercentage\":-5.621972075273389,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":9.316604268061413E-4,\"range\":\"9.238695011656973E-4..9.394513524465853E-4\",\"score1\":0.0010203532398568873,\"range1\":\"9.902780506238168E-4..0.0010504284290899577\",\"diffScore\":-8.8692813050746E-5,\"diffScorePercentage\":-9.519864802543674,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.4255527187620338E-5,\"range\":\"2.408636087672226E-5..2.4424693498518416E-5\",\"score1\":2.6287927694751805E-5,\"range1\":\"2.5596365181913836E-5..2.6979490207589775E-5\",\"diffScore\":-2.0324005071314676E-6,\"diffScorePercentage\":-8.379123205241132,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":7.074449573732205E-6,\"range\":\"7.049360189172837E-6..7.099538958291572E-6\",\"score1\":7.614962302484078E-6,\"range1\":\"7.456424871291536E-6..7.77349973367662E-6\",\"diffScore\":-5.405127287518736E-7,\"diffScorePercentage\":-7.640350293241543,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.659870901180189,\"range\":\"3.651226166681157..3.6685156356792206\",\"score1\":3.9713384641892873,\"range1\":\"3.8358525869703075..4.1068243414082675\",\"diffScore\":-0.3114675630090984,\"diffScorePercentage\":-8.510342889653847,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5616297575188567,\"range\":\"0.5582725986585425..0.5649869163791709\",\"score1\":0.6065983726836912,\"range1\":\"0.5901377228601924..0.62305902250719\",\"diffScore\":-0.044968615164834524,\"diffScorePercentage\":-8.00680778801588,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" }, - "execution_count": 10, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 10 + "execution_count": 31 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T06:52:41.006960Z", - "start_time": "2025-10-15T06:52:40.830521Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_43_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:07:26.456666Z", + "start_time": "2025-10-30T19:07:26.282635Z" } }, "cell_type": "code", @@ -2573,54 +2535,30 @@ { "data": { "text/html": [ - " \n", + "</html>\"> \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -12\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -10\n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -8\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -6\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -4\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " test.CommonBenchmark.longBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", - " \n", - " [data=2,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.cosBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=2]\n", " \n", - " \n", - " [data=1,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.sqrtBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=2]\n", " \n", - " \n", - " [data=1,text="a "string" with quotes",value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.nested.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.cosBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=1]\n", " \n", - " \n", - " [data=2,text="a "string" with quotes",value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.inheritedBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.nested.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3048,20 +3065,23 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " Diff %\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3069,26 +3089,50 @@ "mapping": {}, "data": { "testLabel": [ - "test.CommonBenchmark.longBlackholeBenchmark", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", "test.CommonBenchmark.longBenchmark", - "test.ParamBenchmark.textContentCheck\n[data=2,text=\"a \"string\" with quotes\",value=1]", - "test.ParamBenchmark.textContentCheck\n[data=1,text=\"a \"string\" with quotes\",value=2]", - "test.ParamBenchmark.textContentCheck\n[data=1,text=\"a \"string\" with quotes\",value=1]", - "test.nested.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", "test.JvmTestBenchmark.cosBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=\"a \"string\" with quotes\",value=2]" + "test.CommonBenchmark.longBlackholeBenchmark", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", + "test.JvmTestBenchmark.sqrtBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", + "test.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", + "test.InheritedBenchmark.inheritedBenchmark", + "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=1]", + "test.nested.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]" ], "diffScorePercentage": [ - -9.443531677712787, - -6.278722887168673, - -6.216397528482819, - -5.888492546802327, - -3.5147903591900813, - -2.8370825149381784, - -2.075021911091128, - -1.8519981338583025 + -12.51897578853164, + -9.519864802543674, + -8.535924997642304, + -8.510342889653847, + -8.379123205241132, + -8.110200106903628, + -8.00680778801588, + -7.763869422808808, + -7.640350293241543, + -6.795872851346324, + -5.878039657122179, + -5.737570833099392, + -5.704748465970368, + -5.665144044984475, + -5.621972075273389, + -4.646072762813873 ], "barColor": [ + "neg", + "neg", + "neg", + "neg", + "neg", + "neg", + "neg", + "neg", "neg", "neg", "neg", @@ -3101,7 +3145,7 @@ }, "ggsize": { "width": 800.0, - "height": 420.0 + "height": 740.0 }, "kind": "plot", "scales": [ @@ -3193,12 +3237,12 @@ "swing_enabled": true } }, - "execution_count": 11, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 11 + "execution_count": 32 } ], "metadata": { diff --git a/examples/simple-benchmark-analysis.ipynb b/examples/simple-benchmark-analysis.ipynb index b67bf5b4..ce26e613 100644 --- a/examples/simple-benchmark-analysis.ipynb +++ b/examples/simple-benchmark-analysis.ipynb @@ -22,10 +22,6 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T07:10:42.159154Z", - "start_time": "2025-10-15T07:10:38.291838Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_2_jupyter", @@ -43,25 +39,29 @@ "Line_14_jupyter", "Line_15_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:04:18.828503Z", + "start_time": "2025-10-30T19:04:09.489356Z" } }, "cell_type": "code", "source": "%use serialization, dataframe, kandy", "outputs": [], - "execution_count": 1 + "execution_count": 16 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T07:10:43.097995Z", - "start_time": "2025-10-15T07:10:42.160589Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_16_jupyter", "Line_17_jupyter", "Line_18_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:04:19.102043Z", + "start_time": "2025-10-30T19:04:18.835428Z" } }, "cell_type": "code", @@ -84,22 +84,24 @@ "val benchmarkData = outputFile.readText().deserializeJson()" ], "outputs": [], - "execution_count": 2 + "execution_count": 17 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T07:10:43.289848Z", - "start_time": "2025-10-15T07:10:43.099489Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_19_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:04:19.230516Z", + "start_time": "2025-10-30T19:04:19.109700Z" } }, "cell_type": "code", "source": [ + "import kotlinx.serialization.json.encodeToJsonElement\n", + "\n", "// Helper class for tracking the information we need to use.\n", "data class Benchmark(val name: String, val params: String, val score: Double, val error: Double, val unit: String)\n", "\n", @@ -119,7 +121,16 @@ " // Parameters are specific to each test. `deserializeJson()` will generate the appropriate data classes,\n", " // but for generic handling of parameters we would need to fallback to reading the JSON. In this case\n", " // we just handle them through the typed API.\n", - " val paramInfo = benchmark.params?.let { params -> \"data=${params.data},text=\\\"${params.text}\\\",value=${params.value}\"} ?: \"\"\n", + " val paramInfo = if (benchmark.params != null) {\n", + " val paramValues = Json.decodeFromJsonElement>(Json.encodeToJsonElement(benchmark.params))\n", + " paramValues.entries\n", + " .filter { it.value != null }\n", + " .sortedBy { it.key }\n", + " .map { \"${it.key}=${it.value}\" }\n", + " .joinToString(\",\")\n", + " } else {\n", + " \"\"\n", + " }\n", " val name = benchmark.benchmark\n", " Benchmark(\n", " name,\n", @@ -138,18 +149,18 @@ "// }" ], "outputs": [], - "execution_count": 3 + "execution_count": 18 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T07:10:43.474182Z", - "start_time": "2025-10-15T07:10:43.290338Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_20_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:04:19.345867Z", + "start_time": "2025-10-30T19:04:19.239240Z" } }, "cell_type": "code", @@ -174,18 +185,18 @@ "}" ], "outputs": [], - "execution_count": 4 + "execution_count": 19 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-10-15T07:10:44.614236Z", - "start_time": "2025-10-15T07:10:43.477739Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_21_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-10-30T19:04:19.508653Z", + "start_time": "2025-10-30T19:04:19.350248Z" } }, "cell_type": "code", @@ -243,10 +254,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -254,41 +262,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2e+7\n", + " \n", + " \n", + " \n", + " 20M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 4e+7\n", + " \n", + " \n", + " \n", + " 40M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 6e+7\n", + " \n", + " \n", + " \n", + " 60M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 8e+7\n", + " \n", + " \n", + " \n", + " 80M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1e+8\n", + " \n", + " \n", + " \n", + " 100M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.2e+8\n", + " \n", + " \n", + " \n", + " 120M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.4e+8\n", + " \n", + " \n", + " \n", + " 140M\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " base\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " inherited\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -714,9 +679,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/s\n", " \n", @@ -724,10 +692,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -744,20 +712,20 @@ }, "data": { "score": [ - 1104972.6706894366, - 1.4634989745609665E8 + 999715.5730582711, + 1.3251985400275281E8 ], "errorMax": [ - 1154281.987920151, - 1.489669832012015E8 + 1024476.8651513313, + 1.3567233458470887E8 ], "label": [ "base", "inherited" ], "errorMin": [ - 1055663.3534587221, - 1.437328117109918E8 + 974954.2809652109, + 1.2936737342079675E8 ] }, "ggsize": { @@ -860,10 +828,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -872,10 +837,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -883,41 +845,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 50,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 150,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 200,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1382,9 +1277,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -1392,10 +1290,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1412,28 +1310,28 @@ }, "data": { "score": [ - 213019.57841385395, - 214917.7241256119, - 102424.75929129767, - 101173.75249296638 + 196902.03613375648, + 198982.020454078, + 76487.5086281744, + 77218.5368951281 ], "errorMax": [ - 221389.10361238578, - 221219.12070789465, - 103736.05191104818, - 102438.55849807907 + 202149.32994077116, + 203466.72113419612, + 78379.96894260854, + 78837.91006301393 ], "label": [ - "data=1\ntext=\"a \"string\" with quotes\"\nvalue=1", - "data=1\ntext=\"a \"string\" with quotes\"\nvalue=2", - "data=2\ntext=\"a \"string\" with quotes\"\nvalue=1", - "data=2\ntext=\"a \"string\" with quotes\"\nvalue=2" + "data=1\ntext=a \"string\" with quotes\nvalue=1", + "data=1\ntext=a \"string\" with quotes\nvalue=2", + "data=2\ntext=a \"string\" with quotes\nvalue=1", + "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 204650.0532153221, - 208616.32754332913, - 101113.46667154715, - 99908.94648785368 + 191654.7423267418, + 194497.3197739599, + 74595.04831374026, + 75599.16372724227 ] }, "ggsize": { @@ -1536,10 +1434,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -1548,10 +1443,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -1559,41 +1451,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 500,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1e+6\n", + " \n", + " \n", + " \n", + " 1,000,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.5e+6\n", + " \n", + " \n", + " \n", + " 1,500,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2e+6\n", + " \n", + " \n", + " \n", + " 2,000,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2.5e+6\n", + " \n", + " \n", + " \n", + " 2,500,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2067,9 +1892,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -2077,10 +1905,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -2097,28 +1925,28 @@ }, "data": { "score": [ - 2680506.786160648, - 2585022.6644677366, - 2614856.4118722673, - 2585237.244524414 + 2312642.7736440543, + 2295922.9388216315, + 2295223.3640071456, + 2295128.5932107824 ], "errorMax": [ - 2714141.3425343693, - 2715267.760476164, - 2648971.483481024, - 2618115.998457625 + 2533506.1085633924, + 2501910.6409945134, + 2474678.1337146433, + 2507812.186162458 ], "label": [ - "data=1\ntext=\"a \"string\" with quotes\"\nvalue=1", - "data=1\ntext=\"a \"string\" with quotes\"\nvalue=2", - "data=2\ntext=\"a \"string\" with quotes\"\nvalue=1", - "data=2\ntext=\"a \"string\" with quotes\"\nvalue=2" + "data=1\ntext=a \"string\" with quotes\nvalue=1", + "data=1\ntext=a \"string\" with quotes\nvalue=2", + "data=2\ntext=a \"string\" with quotes\nvalue=1", + "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 2646872.2297869264, - 2454777.568459309, - 2580741.3402635106, - 2552358.4905912033 + 2091779.438724716, + 2089935.2366487498, + 2115768.594299648, + 2082445.0002591067 ] }, "ggsize": { @@ -2221,10 +2049,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -2233,10 +2058,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -2244,41 +2066,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 20,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 40,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 60,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 80,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 120,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 140,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 160,000\n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text="a "string" with quotes"\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2779,9 +2525,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -2789,10 +2538,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -2809,28 +2558,28 @@ }, "data": { "score": [ - 150449.20912261767, - 147058.56562691744, - 146125.99724354869, - 150019.93211383233 + 139497.9818106305, + 139472.55121529553, + 137951.95168809665, + 135829.98563075942 ], "errorMax": [ - 153483.95296329833, - 154000.5481141382, - 148747.83743989808, - 154158.57892833705 + 143101.02418653402, + 143695.13204299458, + 142114.53374258292, + 140469.26639132493 ], "label": [ - "data=1\ntext=\"a \"string\" with quotes\"\nvalue=1", - "data=1\ntext=\"a \"string\" with quotes\"\nvalue=2", - "data=2\ntext=\"a \"string\" with quotes\"\nvalue=1", - "data=2\ntext=\"a \"string\" with quotes\"\nvalue=2" + "data=1\ntext=a \"string\" with quotes\nvalue=1", + "data=1\ntext=a \"string\" with quotes\nvalue=2", + "data=2\ntext=a \"string\" with quotes\nvalue=1", + "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 147414.465281937, - 140116.58313969668, - 143504.1570471993, - 145881.2852993276 + 135894.93943472698, + 135249.9703875965, + 133789.3696336104, + 131190.7048701939 ] }, "ggsize": { @@ -2933,10 +2682,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -2945,10 +2691,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -2956,41 +2699,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 20,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 40,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 60,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 80,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 120,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 140,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " math\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3395,9 +3095,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -3405,10 +3108,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3425,16 +3128,16 @@ }, "data": { "score": [ - 145509.90114707965 + 133932.19330461326 ], "errorMax": [ - 147776.90932420595 + 137986.16262644873 ], "label": [ "math" ], "errorMin": [ - 143242.89296995336 + 129878.2239827778 ] }, "ggsize": { @@ -3537,10 +3240,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -3549,10 +3249,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -3560,41 +3257,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " 0\n", + " \n", + " \n", + " 0.0000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0001\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0002\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0003\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0004\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0005\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0006\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0007\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0008\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0009\n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " 0.0010\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 0.0011\n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " long\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " longBlackhole\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " math\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4059,9 +3731,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ms/op\n", " \n", @@ -4069,10 +3744,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -4089,14 +3764,14 @@ }, "data": { "score": [ - 8.972137714852465E-4, - 2.369188528309145E-5, - 6.7916806977233165E-6 + 0.0010203532398568873, + 2.6287927694751805E-5, + 7.614962302484078E-6 ], "errorMax": [ - 9.206484453035511E-4, - 2.4221992778145036E-5, - 6.8730920645926235E-6 + 0.0010504284290899577, + 2.6979490207589775E-5, + 7.77349973367662E-6 ], "label": [ "long", @@ -4104,9 +3779,9 @@ "math" ], "errorMin": [ - 8.737790976669418E-4, - 2.3161777788037864E-5, - 6.710269330854009E-6 + 9.902780506238168E-4, + 2.5596365181913836E-5, + 7.456424871291536E-6 ] }, "ggsize": { @@ -4209,10 +3884,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -4221,10 +3893,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -4232,41 +3901,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " 0\n", + " \n", + " \n", + " 0.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1\n", + " \n", + " \n", + " \n", + " 1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2\n", + " \n", + " \n", + " \n", + " 2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 2.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 3\n", + " \n", + " \n", + " \n", + " 3.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 3.5\n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " 4.0\n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " cos\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " sqrt\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4692,9 +4327,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ns/op\n", " \n", @@ -4702,10 +4340,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -4722,20 +4360,20 @@ }, "data": { "score": [ - 3.5445401759264423, - 0.5428283650466172 + 3.9713384641892873, + 0.6065983726836912 ], "errorMax": [ - 3.572058960798929, - 0.5468378157356791 + 4.1068243414082675, + 0.62305902250719 ], "label": [ "cos", "sqrt" ], "errorMin": [ - 3.5170213910539556, - 0.5388189143575554 + 3.8358525869703075, + 0.5901377228601924 ] }, "ggsize": { @@ -4838,13 +4476,10 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" } ], - "execution_count": 5 + "execution_count": 20 } ], "metadata": { From 9ec4f587853d7fd96776b238e353f01fe3bd72b3 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 30 Oct 2025 16:14:42 -0400 Subject: [PATCH 2/9] Include a section about analysis into README --- README.md | 22 ++++++++++++++++++++++ docs/notebooks-multi-run-demo.png | Bin 0 -> 140790 bytes docs/notebooks-single-run-demo.png | Bin 0 -> 93936 bytes 3 files changed, 22 insertions(+) create mode 100644 docs/notebooks-multi-run-demo.png create mode 100644 docs/notebooks-single-run-demo.png diff --git a/README.md b/README.md index f0613437..c34ce124 100644 --- a/README.md +++ b/README.md @@ -427,6 +427,28 @@ Refer to our [comprehensive guide](docs/configuration-options.md) to learn about Often you want to have benchmarks in the same project, but separated from main code, much like tests. Refer to our [detailed documentation](docs/separate-benchmark-source-set.md) on configuring your project to set up a separate source set for benchmarks. +## Analyzing results + +Upon finishing benchmarks execution, the plugin prints out a summary table with results. +In addition to that table, it also saves results into a file. By default, that would be a JSON file with a format +compatible with the format used by JMH. The format is configured using `reportFormat` option, you can read more about +it in the [configuration documentation](docs/configuration-options.md). + +While runs consisting of a few benchmarks could be analyzed without any additional tools, +analyzing run results consisting of dozens of benchmarks could quickly become tedious. + +To facilitate this process, you can use [Kotlin Notebooks](https://kotlinlang.org/docs/kotlin-notebook-overview.html), +which provides means for manipulating, analyzing and visualizing data. + +We prepared several notebooks demonstrating different analysis techniques using our [example](#Examples) projects. +Namely, +- [Performing single run analysis](examples/simple-benchmark-analysis.ipynb) + ![SingleRunAnalysis](docs/notebooks-single-run-demo.png) +- [Comparing different runs with each other](examples/compare-benchmark-runs.ipynb) + ![MultiRunAnalysis](docs/notebooks-multi-run-demo.png) + +You can always copy these notebooks into your projects and adapt for your particular needs. + ## Examples To help you better understand how to use the `kotlinx-benchmark` library, we've provided an [examples](examples) subproject. diff --git a/docs/notebooks-multi-run-demo.png b/docs/notebooks-multi-run-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..35f26c6fb6677084de82d00eb6baf45ae09a59ef GIT binary patch literal 140790 zcmd43by!u~8aE0^Be@WiE&-)MKx%=6h;#}fC5?o1r%0E8bg3wfbax}&-Jo>0#5d+X z$8*l+d+y!O{qOR?UduV=h_~M{#_!#M3UZRzm?W482ng6x&%~7w5K!F^5RmfGQNfeo zrlMU0gxj*FVqywXVq#PZHdaQa=7tCe&jLTbKvP%lBudd#qDDp+7kR!ai}!&*jR;uOtE69dd+KEw`*k#3RU5@{w%8*vH1Qa&mefTo6#wM2J@r^y@@eSHva# zZ>jrD)yIyFA$&Gx6JRX8nz+^pj!~c^M(`3BOJa@2+NZk0N2pPy`nYmSBwBRVO|4EP zaO_Dg?K>RNS6^DJt%`EZE=Lbb8en%y{ zu@}Z3owFsGRY3Ti{aZ~`Jid>`B1!MT4V0s)ag-(-E=2>HL-eOMauOfZ4M)~q5}`gNr@@a14>_RRyyK13;Yrf^kZ%t?ql(`v z>7mAY@?%ZUPmTrM8lFD8hac+5-gAG0{%3A{^g z=+(UEza)Kc_YY(1d1A4aMJeR4CG}pp-h2ecdg1J`shqgR9n2>4>n4^nY=j;CTeofr zyDx}_BNoh&*Ad`&E|`z+4t+*#m}o|NpDWV3@B<66j&Jqt$=WS_T^w^=!QKXJCq!X9 zbkQe-0cf4NB!_UUeA|0*C_lYh(~zURRdt0jku@6~6mA`R-AcnK@qx`7zomGE{G!pK z!lkOwwjWLV9WJ_01RhC~$RR$gg`iL}37=>29Wu?rGv>&Ubn5s3WJRiji2Kj(6`^K{ zmr<8?cr3HqAo2Oz(eQrw{S0@XVV|N^!CnQ8TQskKkCAjGP0vJ-|4xs%@#ps@992kp zA~^#yCbTX{LgCsH)&0Lrgi+bKLjvPp0sy;N;usE7Qa* zit#C_AnI+vTaxXsmQ8PHK6KE%gv~5y%g`Iaei6jNcwr|5;V^+f+`vmZ0;yC3`F(nc z52xvFN*JcJro3x+*9fu_4`Xtl@=yyzz3X^jfKeInN-m$4^1cp@Ftulzi4yaJlxW7F z2u}Z^$f9?HqLm_R-`vv76!WrXhn>uL>^Vw(CPjo~YsK8Ze*0$h?dK<=FZ61f>1vqnzVpawWMoKWB=RX zc~f+5A~O}!M`o`Eot|X$v#gPwKXRe2P4bBF@Se?)8YmfDHrwYWHc>OB7_G^l_}AU8|3!w)}60==IKXB8S`$ArBb}u_XT-R*ECf zpqU|K94_ZCmzrOeA8h$~+kEEX3~iN`Oo(agGKXzEQ#@MSSlmwg-Oz;){7?;^Z+hKd zIjj!b*3Z@g51$_$uWOCCe(xK^9qt>@$(u{}97EtO;0oY~Gc0JGFL|<~o?NJ{kD@Q# zPI1?@3y-^mD}+1gO~p*XOu<~oIOF&;vyy?;bj9x+L*spqr<{`a6qhJqeu3eE;|9r{ z98t#1T15UIyRvnYUmwMjB>2TWlqrvQi1T1C=8rZ+isIbYRe)#USza-B!tj~Nr2}aF{GM z1@^#ns>Z7WUX@i$zcs9QTES{>VSBm!bDQ4w&D#y@^0)G~bITsddCg%)Y{scaR8FU^ z%!ejNPQTWE#_u>c9N@B{eJA_Q|2-ormm!dTEAFs=sylI~wx_zwe*a#oJsSNZqi3f=ieK}4)}@0epuHLY`04avMODSv-qjw{ zk`==^9V5Xc!CGKeU}>OLBvRxkoxLoDu=CaOK__bG;_^>IrRT4I^hRGj@Kzp`Uz4+! zWs$1o8F5+P%=-21o=jJ=g8{!gzvp@5Bhi;iFSRBmJqYU)=2Cm5=b~pB<}rEDQ?M?5 zH++R?tOiI1qHgbmaNm>Xs^uCpIyN{n`e=Llzy6Nd&=%R>V2WJJ_5?#MsRw?}JY)IDRHlReE}toFWhkBMKcDsQ?dsN#9i`lQ+12=|+k zQNn!Z3ZB;%OZ=l%gZ7?zsdZPcDy7dxv4^pPu(j?i-02}@;mMyoE#%DEH~Z*0GArws z7-Qj5tWj|`NL0^)tr=PtW8r>Xd-|Jn%BP%LO;a`2ioud?{K`pkF^o&Nz%z5kw4m7h zSB6%kmKJv*cZS)_n>QP`H`GSI90i@H%w$!wZDWiNP0#liSg_ezO~4D}3wI{2N-oE6 ze927&I^g5GUsl2saX4^3^3a6ZlKf66N~lVRN)*8Lr?7mpXU2CJwIpBtQdTo3Y?VU8 zIohS~z1VeK1qO z;jnNqYAYkAPcL=n_A>VEXJ?#O^WPCrqa_n>BV0|RAh6s+Ko#Uw%E;{Xe}|%&Y>I|| zDz9$uN5*W4@TkG_JWl)6(U#oHT>zoL=loCw;j<}1iz|ZNV#^19w-{1E$A?(>DcE)4 z7ttxPI9IZY$x`+Eu69__*{r&Dzu8JJ-XZI&cgBPLMUbJol##3~!b9*K9RV4U1OWwn zLj-?tMAH9!e~QS6aO`LO&7U59;%;&s&jx2x#D61mMpp4e8I@ zsBUSu{(MKu2W<#Xl*Oc^z^AgljiI5Xt%;SL&TQ*Gc!2TtnT9O_0?~cw4^c{q4(x#t z$4ph!?bKyu`1P$USoI97UK_GHS-geDK@fD}2VX4=?ewUeEX*x!`JIGl{(6HSe1{&h z(NO*MirpI_8g*F(Dlsb?Lnmd{}Q4xv9o*2&&KBH z=*a5G#cE|^%*MgT$H&Ib$;Qda0^VS;b+)wAb7HZyrTy0+f5s6vwAHsUeQRfGWl05% ztM}T<-cE>y2Ab$UKmS^%p_A!))OK zxAET{1=%3d|A!U-;`3im0i)rVf^7d08XS{tka7^nk<3(FUIlytErWg#Ux5EG{_7Kb zM`S|Vi9~*cfFOb(CH_Rk32`$SV_K{E@|s~Z0A1-pkh=a{V&>%QV3wF{7Md8fEouDd z$&*sX(h=5U%m-OzG(JQUc`SwZ2?I+d(1kr0F6vYD+NN#$YEL##m{Xl=Q+_46_U7*F zbXWFqr5+@&El4TcrV~N>$KS8_```J? z@}1Zn>;F6^0t)3ZA_3Ju{W9_)V#4q9Qsv11Gf9MQ<7of5#Aj*C$c(4a(_Xpoe|rz#^wtyaV+sf$yYLEP!{$`Uzh<+6ls*>5z< zLjJC^R18RjZZ=3guM@!NrlL()e0XW|QMU|;@Sg$Qr6SVqjzd664MF7ktpda^b%%kA z_Qv$IV0!x!7mi7p#*DiTnVKw&r^7vqt)^^X`ti?l+@I!^8Q#R!=MlR7uo5e~A?&m+ zpnY}|2;8hGKJuZVbFJT$ch_hx5{P9RGk%h%N%v&T58dBo<{<);6c%vc-_%hzNiUy1 zM`ouOHt@pPzLDu1SblR#KMSC$N}_IdMQJyy{IYA*1ru&qe0M|o?^dJm7`%pQ966~H z;3ID#qm}8WwEG~M&rJ0mCcKo>QIABrF@yb^u7oHU6oy3b<)&W{5di%s2Nr6X0dG1Z zSr05F0MnQ_Yf`wuax`E@S5E+W$chW4p9z3TsB{%*-!O@<)FO=;kG^HUl6Y{c(wqL( z1P>)uDK0DWBM_QYF;Sf&Sf3S*T0eNL-Mdlwrh^C&1M`uY$wZ-o`AiiIC=|g$0-uNM z4bg}+GO$E;Ghl)SMH3Foa?r3=hN6DM%0{lL~ zMo+qZ%@agP9ZblNxsx%kEL~hYaAWzVfUGEb*`Igb10`WBxyuXjeUPTp4WbwJ@$OQ_ z6R!^qac|94$oFIkWtdEsgBkGv&_neXz4-d|Mr7{VgxEyb0{fyHOn=DDhW?=wh zu9T3zk^TE(6sW*hmH3AFgrCAY^>BxE?>kL5Bm<%FREZrznMr!_hORie9#>^?FDVdF(ZY{c0ze&x;_>wjqyeAH+~QqrKtm*#0nUv9xEa8F zzz+pOen{e!n>FDtFSP=BsUk%6n$Ppiatd~!Z;&PRX!zfynzjqkG%NlwkLoWK?}t>} zfzf^n!Qt{HW38%l?w)Z0-0;zX22mdkgXh1_cay*x+^Mw}Bs;*fHQx+g?_0JwhK&ylkiSt?k%|`g6?ebne;i>4t zHxnEYaljNBB>lr-hz#ueTtOmWmB{KL2@k>Yvlb1EI6y-nVyKkOec-8HOf%nzOKCxX zJe7g$6%!ars?B(oSt;;{+`%y!LLiRl=VXsY`^c-ZXeK)-?q-FtOc31Q9xISM6gbor zcl8)nA@4Yo*2@W;5$^9Ne_Wvl6#Dq_7v2Bf7m;8US}U4JP4Yd^FaDEZ8^lV}TmI#o z&{~yix&@Iz12q-L^A|up*B*Kh$=z@TC}8Al-Bz12Zy$NSEw$s9%DWG$QMxoef#)dI zQZ)lk_F+t}r2rsttjzr04avy?(wC7FS|33~`1%stP=RUDI+$r9fC`8(*Tg{~m#@i4 zu@K_n`_RCfS>8P4*6Q>di`^i97|SdD+YibweJ!B@S@xO7fSb{OwyUlJUJEk2HyV6H zb02{PM7ODY%wYtY8(%_*{dry)lS{QI@?XxG8#w2zZq=?IKy$xNOql$gf8LM4q*77z z2SK8Mjf5{l5~1L2`oRGHpWp=YX9kPU-E0$&N%rrCvDml3M)$9?7mGQwJ@Bcj^VWa`mNt8SnS_cYG;lTQm2`GFI%~2LE zO6vJ|RVE8icqkG>ED`gO{QKe&2?C_RfG39xzUI|5kUt&Sc?vcng)_|Eu`XrF5IIc~xNaGW~@dok^oDL)~0` zxhSch#Qd`h_1pb&W#I$IlW*9#EvFxI+bln`?|*`}qHNNkR5oeG)Poguf!8hLwED?^ zc)synPkY0Xk~GU#RBV!TKs#6Ilw~za+k>fAnv*ZN>e_C5t?Lc9aEB-6Tz6{CIwGh8 zgMWPPOSSp&VEuF{e9Yc;F_2-n!TT0$j4SW<)p2=!)-9aJB0aowZf3)oie{hQ6Fq0z zXgL!+TaJnukzz{$j`WnI8MqpW(Z7cWGjKqAy$6Cv7)%4r~xZvC6e7Y$aNk z_dHi#JvSiVOTE6xAd*nP5j25co$8|~Hu_plIdrj18J^gfw11kOSkQZ6(uJ&tA*OMT$7v@17q~G+MPc9{;>7vUXt66>zs02|0~-b z?vXFy@PsEA-I2)94mB!?+BN|4G=i2gA47mq7+l2h!-4YeO>h|U1LH_<{!nQEz2IOT zUo57(@Sa#r`J2puRcQUusAg~Sc9OR9%12DAUD{XHt#{Um>rW+CgN9{yy%qe+FAL2F z!#xgZkHS4KzIdyaTWrXwloPlWxJ^wMr&?@a%cnWcI!g-echH`k@2C3Lgl-q&lb(K$ z_s8|a*S;3H9IcPwRZf**)1Hz!FMn9iE$%hTEI)hO!#$P>*6{0m$)<}XL)&Qq#Wp8e z5)ZzIBS=sYw~#O;*!}mhYEEv^b1@i@LNhwto@7a4TN0a`VFj1aO$qhK zCMVd!Fu-!VAN`4)>kx~>qVM^ELjVRk#;0A747&R{m!cs@i$PaxDxWq5^Shc<+}(o( zUW3)iK0HlZ*?rYSpowl(clJ#*@dpVQg7(xv@485C*wHnF;f|Yb*Tc}gqT?^=`XERt z`N*XH;}(G!@XYyx5uY_+W}tM~nkfF`?TRJBE4-F(>#3esm9smjr0-~RYmX<_8HCTI z#NeLSzvqtp7QWY=XU`rOe~=&=*f`SflcJ7S{Socqbl`dUV++ERP?SS;_P32o`5Sq`-AU#+Dske99QH3 z=*zn@rsb$rON`4C(QdRluIo}ZVWiBIU-5a;eoSiw*YmXb8_fmmX#9(AlP`wLck1Q9 z&{bZ@?F>F=;{IySCa$;oor|ZrZY4%@cy-{*9YN=AZPB){F4pSYNw7$J>z^-2%P!Y* zz7JcJ&wSgi+F(7JeDgi4@@Imy?KJSJgzHg$^Y1)P+l8+b%Qrs0&{mXYDUA+RNtIj( zLUx?C_MbIIy2K>yslPm)TL12OnX`?%I>&e`s()Mn-TjLyFhqu7u+j{L@3_Jj3a&a0 za^tBcd#%J)&tuXl&o(XwrP;E8i(N1DxnHcN<8E(1uIHZxHe5Qf!Iw#_HM^om%Te;{ z$Dee*7x(hJq~@zx_@IqcST7x_w^nS;)z?$tI#J}7&$`HN?TukHO#@ev-hlGE(!BO) z)Me+ZgX^hGDqJhs`DgsOhA)yIE@ghZo3dUn%253be20>4+=}VP-4pp?w!#(yOjjH| zwgf=3+L&pSEYE;G`DKmjDLC386n`T~JL|NBEks{{JHcALNl;;>de_fMPA`Po>wZeD z-;;3;ic)RM-|S^BlIpv#Z34G#p@UametOnoxpyRfUmXoxjQt#{jfc~df+Smy=q&0Xf?S7lTD za?pfr{qv6akGdCPbcl1_!Z3KM z3nKJMx-II}X6?x=_DWDD>@M!wuM}6yow@5PM=`g9C-lv=DMGHO-&&7It!f6uj|@Cx z8l1j`DQC!)T5BeEh*$S475Bl52d)lMug5n`x*Vn~jD-^~tfK>McX;d1LS>ER#P9a+ z84^qg?9?0}4bccqPCXPiTpiUoezb3()EmPTbzXM2`9%wdD+}(_kCs4&sJb#a)^-i! zWK~--e!I+CD<%epBEgTftWk~Id49IzyJ*6v-eDVM6QP73nFg;mjfIO>y1t!g@66V2 z8JCkYeXl8E(3Y^YKE8;pzcAD#NspD%mG{LZ9ZRBHleA3!UVHp<=EY3a;wyS3A$%Dj zd{V*P{ke8yd_BSOUP{*b3mdJSv_}=F0-aaSu{)>v1F8BIX1~U2XD75=FcH}kB>Ny2=(|1zJC&;iFBo*7_SPP*N^dG~UEyLyKwbV~4t(Y+)3T_EZg zC$*5rnxz^)e}&N@O)7A8B9w^3;d*5|EZD)jtHuBS1=dkjFQc0pkC zGe>V|9yzMo$mcd}22c8U#!<)WY$djQ%vxvmVq~qwRpJ+uRrA#E$GrCY^10lE$6IJE z+=gWYZr$#~7*XY!u>yQJIQvgM#g2_WQ^3xCzM8c;X?W|6LR4V*T8YVolL<%6@pDgJ zu@kq`eoSeePXDswXqm)9+y&QB6aH=O2bv9Z&*hRl z2vv*^-(&Mm_rtMG_qm7ESeCj)5Db4i=n?S3cXyETRFRUC1l5)VOjZ1zD;i>LoaJ4Os&aIfOQyPW@OGcEBzYf-z(%Zx#dDH=8`|fA$y~8E5 z93PQRi88{M#}Rh5ek@;trr+%T0U>F(`>jsC33vX*oLC-mDu;gCqX40k8OPKot+W`+ z&_%~~hsJz42h3Q!zq={^!_VH!Scw+3!OaSuEgf`50VsxciM`yIX~nI>pv(;c9`s(Z7z~m zUqsg%FVK5V@4r>ce7xJJB*-~o*cA~dc>nXeT0g_DPebm0GO&5x-Z*Hf-qwy>Oh^n5 zmW+y&Vya~(hc|0ckS&LryA5|;=X7uLA`yaAQuRI`6rYce%~H zZN}#JgmJLGNN-nC0rnT#`JCj}S=a@?4>>9cb(Q_m8iEf}u^8pfyTtP7m-p($@%k?{ zkRQ8m1u^9-ELLXp6}H@s$>&1ss?~F5KyHZ&G@hXdv3`r{8P7htv~o12Gq$(erNhwN z^j176n6>H|o0y+1^M|svZ;21_^^a^k)rs)+a`MWQ7T@dftp!_npd2}0I|cH$&3vs; zIHYjh{M541If~JRx~Rbz#ZzUpN~?Ml&=@~d`RA5To3I&(l_@j-FN}!uE4K@ zGA5g`7*|4j5PM0#E##iFZlKE3 zYQqg$!PeWFF#03}Cdkd)~)9#C?{W&AJUZL)<+QA6k&0hN2P18GOV(puUL$dUcrbp_O8|u?9cL7M0*xB7*kn6Uydv1m9<<1RcQ$Y6J~)rKiG8*P_p~ z?REK%XuV>Uc9m$ZdfS3--=>QoM$A3+zP{WmdZ^9wn#wyDBQ3SEuaX7}e(H&3t1W?b z75hF|tv-9i-$#Cg`DOoc2?5GqJ&%=HN(Ou4AHzV3ZzK8Pf8sbZVntNKWS&bvIq zv%Bq@3vmUwm>O8{>aDUw?G%PgbLNk}hAsu>q|uJBZgHV)QY(7fKC(jJcysgb!UjkKga+Fxj7)?rJKtsy&K%Y4Ab94qtuo2Ri9D8QT_0=ORj9?M3Xdml$we zKMV`r`BWJ57r&Z;j9pwTq?qxhA_J)k8cN64cdW|T>P{CcrtzqrcWASmPlCPOcO1TD zysZ@kTuNl8i-rS+=K)jU3Vxc#V^O`)*Wli~uWn>8JDk$}aA1-P#ncCxGT^Ct_U$gG zPuKE^JhHAip%g-sgkOYoK+6(`0j-DYA|`xWh}n_B^}RTeYlP%qdXaNXYmo!#M)UFR ztJ|2T?I)v7_N5q1#;W#fh+UtT$#G<2aM&I;|G-X{Ia-)V$e%Q)$;Jvr10 zI5rAdG7;p|#DH(r`G?Hkl3SfK;*&w|>j?Ko4iZ7Q)?KQ`reP5rz59%c4e68=yH96g zC%4n}@pt}$q;vd+Yvogqb~?r@27M~;8uWQ9nTwt9GfHqgp=iv<>J3!FQpj0bA89|r zfXcfYqhpzF^x?r!oI%e!E7I8T_9=0wSpZlCW}jT14!QEK{RCy~QldK|0j2n1s374|%u#{&|WM&uGDsxeY#gNX-G6)vq_<%q@MaW2LEFOh{~_)SgI( zyC34w{5CO4_K_M1EN`LVl-yzetvZf1m(oCvZ>6Bm_lWt@h^K^iuOJnB*4)1xclKeM z-AtO&mvoSbyI<~N1))S<W$9Vd?A0T}L6V zc|;DAekzs12Mt^p-LG&dnHP*|Xy-9dasAVF7lYX*4RHo`_P$v$RMVtZP{5_uQLJQ^ z8vW|1o0Jry4(r&fcj~I^h+CW6Q{z2Dn)T_VE}P$ClPqP9funhQ;dZ{1=C&{RsRAGt zWhy5xg;@_zY>AzQtmO8~F)L!oqlMTqR|oa~XwI0aun}^zqo2EK;v&67ch%&G5Glv# zZ_bz^%CtH=+|ByFRXt(ja%valQQP&+U%qxr$9Ht7IRjlymwb|-Lr4F0pgmpxI<|EU z#)B?x-I&>^l^mrfwAbdYoSi>Am&1FBox2Ra|EiPFx{sSmce}YxgM4{QH{|1civjxa z+hy;FMRKURzNwSa=97M|xeT|<{}p2%wtasg=z_miD*W*itLv_(TV=AlNC6~4s|&W! zNqUKtc;GjqMl39z7I^|(NZSXIxupEEdOw3?6uB1sWL(QXh98nPRyrm_q}C+`$DU+mcdPx z+2tJKL0(-LLdCH%eCkE<*NrMUI^gFms@dKo1R*z0$!;V90+S?a*|>XAQ6fx8dE$sI zywX!{Ae*Q)7hPgy^}yB{Dyg|HgRcQ4m22&D zA6$|lGCF_dqQvWF z;<;*{$;96o#%hhW1v8zNkbr#;rQaK-Ml|Wi31vIrEUiriTe7BxiXzV?WQp%hOfKW+ zdD`EfCXRD!_J3e+u~Qnk+=bkUgV`WFFHW>MYXXC-I(WY~{_ih#Cd zm<&Bp-$iq}73XFxBewhGUQu)+Zx?g%YK@_W=nlZ)?GbO4lKlE33UHL;Sd!O>X5kF{ zb>gH?tz$nWo^f93Xwiwl#2x%85UksrB3+(za9`eOuimce8l6Z2IhZ?b*!+-X2t$_V z-TXXc%95Ew*%Dl&eBmUANz<~eBErO4E%8RQxs7i-PYSLMhvY5Xt&zgX&^g;;fQ~s@ zF$ElK&+1lh7DS#a_2bE~kO;y5KRDrWv2kJj5p6dq4> zV!SRH6W(6g`f-ylp)z(X2#NeZv}r-kLWk9eX4nwb6^$F_)b>ff!Ee{jOERt!w~XGd zh-tAD<~A8>ogS*mmM(NOtZb3IP*?_Z*p+w2F3NGjFxFYj?{?vdOf^VcE3Ddh!}Qvn zpfq6e`R`!Hngb2 zPo`~2Q#4HEU;5zwXtnJOi0t@XUVq8L$`v8<0!Vlb(}CzAbQDJV|9ljN2~S4f^LU6n zjqyaLW8N5C43#>IrDG&C@LF59EZ1*zdbO~DJCJ7aaMHP?C5xrKrS_?!w@Bd_6LeE@ za`6>-_wZg(V`xiS0_X7Vyj3sGZ$9cH2qEZ>yGHECdz3F;n%?izD#JCE*~Nlim0b1h z##z5djglwJf0k&+sm@b)LiO}~W6eX`amHSV*YG@q&(eaBc)<@ z!z?N7P?(zyTLSQTtkCt0I_n&kY65(4CvAZ>O_iPUCG_b!MQ>Se;LV=^#*Ws0*z=ZDQ^3nWfo74`~rS?uBB!A;Kr=l zN=SOTvbXhAJXhXDYzLPyqs{xNjIb2tT?dd4TLPapguTuTgV;*>&ulGVCY=r7m9EoO zLbbA~MwGT&$TQ-_S=1vylNQy}NJ;bhY5=Z;W(#!C27ADMk%H%Kd!+0W#NSuUmCKRX zQ5N8KV?=RpRFFR3DA9sv>;3$W9q*_B_%V7Db)(S2VTE7Qs#Za+~^k#N0PDTkBuFAMh z7P{fd87VG5Mz^Asg_Oa)dcBe&CTMsa|M1RlM8j6lv8@9Cq(1(5`4;i@lHJXwqQrGqN z+xg`e06gnG2!l%f%4i0Hl9o9+anXXX$BEQsE&v*a@bPI4WPopN^NM$WjU*KD?&6?F z1gR1)!fmR@*~`;Q(TKRLcA0g*nO;V5E%m@fV6Vz# zng#SX;8FJhhAt!BFGr;GU$`Q3fGZ*($)iyPxFUS9n2LLZZqLnY5>%3X{KB5A|^>Goh(4Y5s0bgCIASTQ9l7UIN1seQ60zzaKcPIreS7)KjWlN z6#e^AX+Jq&N>y|6*M|~~{5WD{)$LcL89>7FG+!B;%ss@eituQgREeOjz4y%ID zzvUgpuRtY0ICZ1GBBY|(hU#p87oYbaWR4`ts`;M*(~Sp}9)XGn0I=_b(8uW-(j$xj z{?GY>g$Y0`V~mWy+~6NT2RDM7t8S)0Z88RSBT0Kc?TCF{7l4#(#R#@qy_-)5Dq*% z$^>9wm+?xIJOBoM6g->(4$0T`H$ImEFt8#^v&%ielG_**Hx~bl3W7y(G;(OX2JHm2 z2B?3q$4U?;=}t&D9U^!EW1hp56_SEa{QDbDLj?k5KGZB9w*U}s^WQ3^4u2iaFO~=U z$nROG9FYJfR=w|50 zeL)%x7#V`gn?rDUk~}2H*CNu!lwbgEn^j<{Ci=*~578L-1~fcVZ-V)T>ij7NFat`E z@c~VE1u8m$CuuzA0$l5nak{UAGzLGGege-Tia9(2%@+@_s>S8yz;sdl% z`Ry&$3K!s6%%_ofLw)4ELzVZk0W!bB8*5TX{@0kr{C_d!=Bq)zi2Sn+iT`si*kw-p0QGRjca zHQ>NQOxB|30X85r6+i_Y5>RmH7}cA((e*jB=l-t`#F_&>@V|vChRxu0rGH0czZ>g? zBHZxU@r)(#`j(n$DJuZ1oiP*KZw8R(1){YZZ;ynxRiLUFZuEA`DtR+!4q5^Pz{gFr zo5mdh1w~(kctJ>)3I{m!kN}+o4f=!PU<$gX_Lc{DkN;ILlPW4VXJ9=@^g9Rfl1P?C z*a#}I_`fSWsi?s~7>JzC=AilY7yTw=Xdtil^gy6&QoiAV%8>b>1a#9VgBLhkySi_f z*E*D@kmtVY<^fs8H?3@KCQx2j{?>X*vN5BgEK9lvkls4DV!?otx<47l&G7d?#R$R2 zQ8>i0a{zqY?^cV$8(KnDdS@=j_Y z@lct|+P;D10$4Uidtl)pD8*rL|JKa`S@3`phr<;ZVYx5q{*4S#1%i3EMTnD~7O_6Do4rCczjEQ1@&oUx}!RTjP#)1E?Bm9RWw42iG zhr&9Jmy^Js3~mbAwL%A<&jDHAoZ_9)0n38+$O3|cY21toEL zo27tX4p=eeSCI8rXAdWVvKMBJ83*7v@+~Gf|IR+|B*;TyJPJ02Tqgzw+cG3eoCpnZ zDnOREx)X;anBK;>=ksgG9bl2dZlq`t4US-bw{{=nGiX=EW)*Xc4SH^3%s>NbE^Fii zciA2>UziDABOKw(CB}%3M!4F&-Yo7LCf0HLiiA&lzDL$@SnA+#Z@-7VN0lK z!RAr9{Gte4_bOU(ABK#9jGPqrC0*h`EQt(bz6*ZuMAd~Q(U z@uI7EhAsl%8z8e3WaHRB8EymcdD2U8p9vxLN8|*yRQNc)7&dE8ueM zHU#g_y1M*b-jO93E6=w=2py1bU<&WGz|7_wyjQZ^d=mZxSKyLc>VxWhg$K{0zp=4Aq^;_idctcR+Kpt6zEIEzHAF+=5N zwt*p_WH9%m8K};B9v>C@fXN%6@U>*Y-RIHTkfa5G+G<&~rAtK(zr%%RZXkm5nESD} zwKA}I#zlm78*Y7C48O}Es^z*>>O#P!;)D4#sOe233h^*(2hZyVncN=)J-y)7>5^H0 z+7m-dxz#Eiy8(&y`FFUZd)I#;_jZ#dw0`%Nc9{Q|WXqcTrkO_1&+9%}Fandu2LLYo7La=eWfSV-Vv zuONZbFbLYc?#vzs{P}+Y3~O4|jvVpm09d^lxQH4&s#pwS8fNp@3+}hKVR$VsxFvrGYq|2w^|v*8U7FgG*iJ28kFgRNv`s)N!gf4^25 zm_$~`%d+`Fl>4mXSta<|H`{5}QXm+N&V3qL0T$N4l#U5yplL3Ftr^l{J5hQVmx1Jn z5hI{hjRol07JsN%`&r3r+QUskDC`h^c5${Ox%Q>_bq(P4@**u`?>)kNnn4w94LMAB z)8c^)vr^0Tev5y^kk+6%bqmoc>(Fcx!S84X&B^YFs$>b!hNHqS3ERL2O3jfuO3dUw z5c2>{YHp)^4zl~!_6d+=WvLt}X1=GL&2y0)dx5OGTLzO#hKbHED50|Ts}K;-vjH!y zmgVQE$!t^bYO4F@V<-{n21uZT-dH%024-+E+5Tr7$SKqBgY@PTOig`(HAI;o{$G@N zPp!Pq+LdI^tbjv0{hXLD&%66oqIuk7Ks(6jx=G3DbvDN|h|)mhtX&g}+oA=!IEUV>`DlZlLszfJV%kry- z(~GK0T%PT|TKN*M2_~uVF_S<>o0QjEfQIi^BiRGrURA2=BCRd{ zXTNIuGW1oHeB<_(*JULg;8D5l4{Gh#JPPG22+{=^sr>?v3-g(?i9D?iz_R`RSM>wb zJKBG>Q@^RSo`HnK_m|U;qIR*4jdc*~r~dDPMH;Uj>41ssEkgb60<}k+_6x%5CfdHn zP{MOtz+Qh0Q0`vO3AMFfj$;Rc=GB-6Vj}0Jg!-cuz?pyP?GP+-j1xE6Sk`p^!OCaU zjRVdKzy%zj)PR4=D?&q{q!_>2dycbi_^#@?s?>${CK;dDdkx9+ft|}9uZzr=iRL$p zmoq|N`H-DcINxOfB>GTd%V~c?%A%C~QquLp(U-|NA2fB_%$Sg>eO!9s3%p_UbuyP_ zKwvNcnAsUKZKdtJ-rVxIS!Owf&HCP<$>-7<(>JOg%+xu-Vp$mGXlKsZPd^=XX5~I5V6kwmi4o zMPThm+mT*2yMpG)nW|>)mlub%wjLi_*-OI(+(}(oua82x$lCDayY|~Zw#_m|7j0Ml z**4n{@>75@Nscs%E7{$wy?m!f?MM+fZ0~idm%POhum2)Ol%W@YLaclV(6?Ol>=Y{} zoyYOAsIlr#yX@cfKZ-lX08NDJ`N=-9YT%Ci`i>dvxZJP;xtz@z&`G$lN{#i{rI_!G zCyUtX%IXde>5SmKH+Xlvkh+p==h=A-2(vl18=8O(f0}5Evu-*&iv+!OHJjQH`KkK0 z`%zh&1i5Why&wMgDXWc}k;k^Y?8kIc))}|uIXlBCW|wDkR~e81X$e23IkwvaZyI_}8e$ycxi~S~g<)y6)e+qkkRL<~rR0g_h=ha$-}~HxuXE8o zghkm>aF!hI*Y*_>%!!a9H4D5(Qn%o$+39DLM~`3EPIjsf$_()v8})RjXG)=bu)T%>Y1lwn+?oP>9z*GUspKS&tDRo_&ybeiSS zPfNIPy)ZCoYLY(BH;YTW-{N0Ho)ht4k;Z^&RN#wrk)RcTBF%JK5h9Ck{AO?>uZ{j{ zm=fl)nxCw6*{Z8DPovTk0DhY{tRgY#LX=yWyf=Ow9ZiH{4ULOH-bPY12WeDOBsn9^ zYj23UdtM(mwYrD;Mcy}|WQ+_nb`|mRrVifLj+TgBw;iQyU*vMfAPbzUsx8#bm>8@r zkQE6tL)1oTCvTU=ih$ zNsW@qf<|3PeByr)?tgTZ*TDyGuQZJ(LR5qYFK+$=J$%INV+Ji$zWVJuXrZcSx_H9* zp>1-MGb}GSZ?Yh9gAtrR-LDDLt~a~%Oa^NQ(FZa*CtN(3kCNSE7i_|M%EjOXxfw?Vz%Hlrq8z`csMBBY~H6aw-!`sD? zZu~5)fJ7g~zZXVrzC(BOszzCC-2k zHdUKbcJ8-3p5_2$cDgNt2j#_LrbNhB@0c$g13>=#%`B0ZV~SW=1ZS`Xl3pTN zkFo)=U~N})3Mt!0p?9Ls*}yN5{K+wf-9B+bv%o(YH7@$K;4BHq%R=`8+fZD$Mzy}M zM5tcj8U6myh_YS*BIHiFxCXZb##FnlOMGm_&8N_y<#2D#{+jkqcbYQtde_6a(I-1C zKPmEivPJxEV{7r??=r9yTFJ)_D=`~j@4N`V=#HXRj79QfB|mUv z^AW*q>eofvPtydHWEmvjv z6IZaSvh~9Rlm!v^tmJP6s2Y!#EwXoxUvmDuT&{7AbUR!f?6{~i#hU^&-Kb!7uP5in z0rYlx?i9t=F1JXTT$IGUuyhtY0WhLd!+LZSI_Q2ov7~4hL#T`0V-`>v5O|IDMMpW% z#P9RFJdk|)@ar4~-RPuyn0x6w(P;=DY59%IxAn5Ue%$l1?;4u2h%35{7$(mxi_7Gg zQ-3Sxc?xO-$3E0VlC{6YxkVF(c-aQmTd~&w{7+G%B1)AddBWRXE*b(}upY_FD%*|- z@l8wnK-#(HWVt4e?+e4EdSDT^gSF63ek@s-dg=5OIjS?P<3w4cB(E` z?Yb2@h1mvz`X>sEPO;UTFQVxHXG9kSu=~jc7{NQKEV*zGT~|-DM3*=i;%30dRv1D# z?s|W`*&EGZ?{vVEQM&hfMv9)q@Ts))f%+2+0@9Sne3_0_y$IZilQxuwA@Ydf`eZW_ z%qqy0UBOyVaY*# zfl7@Loy)|;w7FXsf+1M~+JGCQE8E*BL1-B<}D>3te^2>2FA6b#72WsfDCu-aP<%T>O z`q@DZ-L(?>bsuy{%0RmQd8I3BhC(0(`8H8XyuQT%TM_P{JM^|Q;Z7=&37Oy_8&zt! z$GNTj@Y^8g&Q4raibt%3q0N*Dr=P9av{G!aw&)4~2yF~B4PDI-<0M)h91TKq+2*_1olL;vN7KvFp*#&3u2oXzZ zUNyNLh|_gHOEs+73?!v1m}TPw5f=c!S-US!<>5T(q&1!;zFC%;BT<$IHufX;0spb^ zED>plEI26Yas<{TJ_{!T4Hqx@S`kJU;|IH7mt;3r-k_gw2d1Sjh1NN2D~L!2+T%W9 z6{?WZtV4k0>FJeofh8#uCQ2iY3`iy$<}_(`n^@9LYz{}avJw8{d1e1^3#aq{3$y!= z@f)?_cW49PP}GfGLv@>Gvh4JBtYmahATIxaLbS7RWVD^Xut#oGe~yo{A) zl0=D2q3yn(#d5@Kud~=u&_v?}t^+m~feFEZkV$(ij|j;s@a!l}&^tf^f&ci)3sn== zK7T<|_|GzLp@L1Qvl`?04D7M#$oxr0c#7Q~XYSZRlG&5v_sAWNGW=8F(JkTc+bJnp zA?Lb}QiTbeAly%i!pK0u+bEZueSS>Kz#F6(nJ6swiyghUkiY<%S5Va~z;)>rTjBeSpHjstn8`Nm2q6 z;d=u7{=qgVBZ$K4U$l;6w);Lk4`@8r?iaKK<4f23=Yic`jeBghzD+r>CdhXIekIFF z`v6=S)&pic8xjNjAv1nL1)buXay+XGI}LA4v>STP7(iGtWmmben48x?L}DwN0qbLv zn$UAw`C`j3Pe{tZhZPv?=`t!fZw|L@P{n4uWUj{_26i8>^j`L)N>oc6j5PWM5>+WM zbIR1+Jy$$fm8M_};XP_a+$*V}v6unT+@U+oQ_Ezl&<9x@M^{4D@^P?eP#2t1s*O#O z?*s$X>dI*w$wHXFwHX?Sb%VunV<(V|sQ0?)Te`U*>zz0WkBQGDO9cYa3ookT$XM1u z7joDIl-YYh!x%d8^S%CkVa6V>L!BiHrhl60af_O)!UF#PzjmsldfREXQ**jG{-_ll z$YjT*sm5^GJDG_SYy=!%dXS{Yb4fkOU9YpFZ4z^I_^$j-ozFRNON zWMJ@e-@XKEkPmq6S1OgDWPD>l8B;IelK9|hguB0lK{U1%sMndaA?E|{Y+r=sSbWwD z&TY1bVR^2m8PmvD{i5j)9JztM`nQ%4^Fi3i3 zAFZo#i4C8tz21~HwVt=1SHelq( z9oJX0FZv3exAJbuUVqRO7a9EAOR8GU-Fd>HC15-tKBx9F=u65UO@enLjoAiB@aQ6o zaGs8ND33zgal86-vy!B(@eMr)N$i-K>eH{(_w6f7mFH1bwfn{~!~dpIkjceFFLiDa zsB`+~I8wMvsrr5Ggzt8mt_2-H?kjFN_mIi7KkddLmn?V2DSl~mjLPkN2N0dtWO0)z zLgZ37 zd2}^B3y9_xf$c`0VM0LRiWbh*YZ#!rAI-x}!?K=zSggd@5^mBA%m*NFIJHP84&*N) zRs5FzuSNv9BeW=?1Wp;Uk z19kWcOs1Mb53=Q|tU{>YO5@UV`1`%Yn8`gi? z=ARkP_9B`>gW0pkP<6!&nEb8+!?S0s2i!V8RZH)E`SCo?_3QH%_TzM>wgPYEs{2K` z)CO;RpB>{3l6cBJnK8oMwJqE=9-d3MYmx8+K^F(IH?!Eb2q7pQqn9mGsts zUER~WTYQ!PF>C&}O>{OMmMeYv%?&fQO4%y{>*is+kp36thJ;|ooXCYEfDeyJXVpM@;D>G$$LaT>&oZTe zh4`tfvHkzdh<}!^t0GU*eAgL>tB;Mzi}Lg+3dD-Cy&Ji>5t|#*v+QNFq{B_NFB;3&zQlFj@?$FZBH=uj#SfY&xuEV`mjiXb#%wH zE9SpADZI+w?nloC@;EGS9%6WWqItFDH_=a}GvhuhO*DRG5BT=_ULoK!goUehM1v`b z!9=T=yGkvYV8^ z;j@|{eSBGi`MP95(Ha7t3?)j{AwUTTiFC;7rniA;lf&hJ zzDmr(-SKB*r?CV?>8HtJGu}7@9=ly%ABNL?xe3zFc}l|JTF>5rG-37h3I6C{(O=h9LYD$WH+B+Ab|4Zs|u1Q(YLMkmU~|TAFtufV=@?~+HWf@!~fgi z7ZB;`ZGaWc?T63tb@BCd5LSqUUIK(l(|xo2>$#0Ol%2b0)yKXYtw6yIG1lJSk>B72 zL@#Gf0XaWFj%m17`~w$wu_jeN3I}8lZpSm{Qsfs8l| zRosBBMWX0~$esSYEs&AT0djXqE11PchXAqF>`WmG$}DgA(fgc0`WDZd^*Fe5l$2Wp zCN@}+^&Ge}D0!0TN?_^uJL;WsG zB4FQ4{^L=P7@)-f9@YTF!z#GCMgg&H$*2rN*Mhz9D*)ZDg1)8k)WHNV4P-Z-)U#osf!zwhM`r7G_#CmT zL*PgdqO4nNjT@O?SBYhKKKAFEK5khSl`RV_i42XRXkO6(d z>c9OHv}cmN#!IUO8PiuFZ5$jk(VUw(;|L~$??#s=!$hYym~G0?0k43u(j!Pgb)j0X zU}||v+;MI^%CslGR}12{M^HNO+2i;dHhPN5$*!?X56vu}%6k&SxPS$V_v(1*FJ1Ew z&&A|>Hr~O`X764_bw)}YB+v<&1+9X7Sr=;<|F`=}_E=5#d6H(Jec?Aiy;+Nc1AK55 z_*&(|sF~g!eX0PJGYG~QeddQz_8eWKhENiW$QdwH%Jr%DyABJ4k}?=uv~3MG>t^F6M01DztREA-EczvMiLH2~G7Itx7c4#r*^-47Lr77xy$;HLn8 zqhH^XGqf!p8~}!FnbWshK2!S>A-{eEfTS1&?0U3qka^rw_*Q&|FjEzRJoM0QX(5v6I0hpqJTlpYtS)0eB&KOT9)y;!`H z#30qxtI|nl;?aWj%;&iR=OEoY(DN$F@6XEv%4E}s2X|Eg*W!>TF6tjaLoS#}t-1nS z3fMq6BVN*34zV#djxlxzV74&pN#J0IKA@G%x{3W5H*MI^UCjV^b*`2#r9M4sF@tCe zBaT*cn>ih2z%|nUWv9 zE{HwJzOo4m*F3L5}_OZw^>I+13PR1)zN zak2>nT$z6&jouxb-!rbe0^w!Vu4iETYw?|as0N|{LEaC=UHNFZ$d|zQk-uCA_$;!)W?aG6eE{@?uPBgZT^vJo%~J-ZDTT7(((v`Zm(W(1Jb&9&S54X@T_}3< z0MkHWdtsbPmDdQ;-?{e5*4ih;wglG1><1csjUtcCo-%{rg#W-$2Lc_nao9#CNPt$)0;9m>`FVrTa9Kk;j{G#*1fD5SOk~o6 zQi`-l-X0U0BX#mx_@FfaoT>urs;B<6{23<8^I$(nB_aY9{bdSgdF@y2PzN^bO)HBC z9j7k~(pX6-%yYnW@VVCD9Fd^_SS-`Rt<}#w35WX&EcB>MI2CF9H+DNx9AEO%41 zJ8)BHNK$lbMP;%Son>Qlf=+Rt}-tfyT6H9O9vnhz@x4h&M{ zaG`9rhFI)HG)J-SA_poqRaIuJjFTin=+k)2;S&SOt5w&?K8RGe3`RR3dWkoE365IUWg zRs-%!%M|tFjFlRKv;)L!lCcdt_P3fFLpOu?UVQI%1iChi+;YKjCEOvRhKvJ1h>esc z%z~0(;@fX`1Fkc^+DfjH_b(iVva62eD`gP2f}CX>eoIPyU1IN1a%3&PrEt58Y^()V zs?%<#utvvO*OBvXi)-w*S>LRC!-(R6Q-A#L4u$yet(aq&wXOo_?DmBJg7|7<%2V0Ir>H7njA-Rza5K<%Mh^Sze`PHf(#hqQ`- zye8-yiF}3xL2EurEa5&%bVI_`ecTWw`g5b)>&X#VVXCVGgN0PD+2z$=g~<`Q%&JZ) zm)b^)E=#!Hno#fir0UTeS=DAY_q&Zg_)agk{j$P^Piy~eIdYGtO6Ag)g&@a%b(e;E zNt0?I?OQ?Kc2N~;pW-NS+gS|bvOl$MCL7n6R)ovKw<+=u1qp-6;wq6;@-Mlj2uti1 zcrp|kq)-D!UXq&pIjJS>`;#z-H8rW(%%l*>6EKn=}5Ty zkignV3v(x96##AD-#-h}@COCtVRCB3y}!!k&N3=ydQIYVy--YYSEcF}9p~zAwt79& z@OxF}aXQUeYm=3w5{Ho++-ItZo4r&hX6NHZa17JSjyUtmv(jonpKG5A)VB0B!Vp>$ ze-=gU(FiZF!d~JW=Uk&oVy}>}hue`vVW6JmaSJM0^I)^Lhfw%Vz`O9J zAY^q}FJ1R<@vb2*MSVFl7d|=@D)X`p;W?EmcW??WQw`fWYxRnx6_B*MW_nsllt#w` zRSOUSeTS&eR6n%4MF3^^>tws3HK0qD8oRCmR%%trcjYcXwEZ13Xp0ZHmSZBNaZVH- zn80*#2d<8CWWkN7TqaI7bDi{nV1die7!c0eZFRsnVN-7v>LiB>a3l9`*L_Zs^;fZ$}Bw`wP8XPSEYau(x0eVS^~MEej=6V#Pz*FE$^yNbop20xFnd~q8Fi>nw8PlD{Z~KV~&hVbe55N zjRSY@tTt&3C@-y2KXBqoWMP#m6Lc1$Ek7Srm77Zi#vMB>QB@ZwF81*r0EJHF^Risy zRH;nllL)ibvN>DP@EQ{=VYymPIoUcbSz`P0j>aQNHsm_Mmr2T7h4f3N0&;KZvKFil zXUs`)J5HzC4`BOVsCe9%O;Y2F}IRH=?jkoeX&io8IQ92ugPG(!I%B%)p_~k zx3bid7t4D{`ZZBTPwMeK2j_zeS|S*&PpMa51HR+9$Q+{ShG>!d%^98RK7Zy(Bl&e; zO`L(EL9RMi^jUTi$XwuwdygYGT@0dHGWizfr7h+4ppDa-!|I`bQ*s_>Yk>!ep$_D! zSpFq4OW+H~5j#4ZDAB=WooaDpr5tGS>gUfML8o{q+tpEM0c~e+xYq19psdQ@RyK5k z&df5#`v#gG`{55HC7{?()Vbd6Nx>!7?Nd82%|p3j%<6D+C0h+yG>htSW5ju`Ib?fX zUW_H1fsM%_*I=4L7>!9slqU_{Y*Dg}YK*8q8M09Bd}Z%pt+>Oum6B-xA9d89gdlt^ z)mL-;&R%tLU)HBz&{j~!1QBC3sID6z(eI}~)h(iJ-|08fPe1f_+_i0C+y0uddX_<0v5s54J9gdf5eaAt9YT6t*XbC^1P32q;#iTmmobdi^6eg6se<+}0fy=Y! zC7KYt@!4174~5Cm(g?Dp4W{Qa*OE)zeFq(RGRM`5BJ7}Ttq~HrKARZz3{$@olx4H` z8))TcRX+l=v~m{ZN((IbwyGGP!V)!abo5$VA)rQ$R?S6lB}+G#beemr>S2@`=&9Og|G&0bO)~j6r0i(bI>B2C53@!) z@x*(;6+e#3LH>Om*bhGy?a6;_VcnnjFv7 zN?Q7twfn!_{2xv4fTJRSHpvFkCiVSt83kKp+e_9WaKIM%k2bH zExe1Z>doyB4UCK-91N&3E41Z6sh%XM!g)vOKcj1oUjuebHd`e8iC3(W35UI6vfcqV zDsuJWbW2MpG0W^19)}7ok4}J6aA|lruvEg*7^s(yP z_4D>|c4ovAixj80Ze`9JgJ3f~a%UXcTDM(Ai=_tP5Ou0WNe0BK#wA4#X&y9`aur-d z#Vl0seFf}o9YzqslRP#f}a04(vP95)#jL-Wa-q*ZmR;kE=$R=sE zKu(~{xwBucs(ouTSvl?0i=_rR%cGN_8Ywa1(m~aO#o?}dj9TddRx+s&T7a24!uVw3lGwa`$3nS^d!K)I|F&;T%=wGGd*pN6->eqg!xYG=Of zWDL+Cf11_a^NgtB?T`ib-SY77X7==+M)1|xAitBU$wFh0snTKVQ)jcDX0Dy5-Vt^~Y_uwRX-6g9wa>&r#mZRZ&&E^G#h9X|- zEbUh_ue+z`@3-#gaB3(}0ag%`7D=|UrnH{uUz+=@or}hT#-3o@wlu}p zKo1Yj#pHph4?v9Z-u{J>5+#_?@vha7Z+c!ZZ6^AyPRLsMir4sz`&F;gR$`iaU+P{i zsa=^yABkV}GMcl0^w(PPBCh#T?8r;kFsl8#cAPABTpil9`#BKaO}|rjd-E@?TuoxU zQWAAP%A1p!R0-HK%B7)Nv*k5Jt<1k?1vHDRj;n8B}x`*UrYe9eS$-IUU* z!?Zn8l=|xNM(@hYZ6blR!O!6OPXqD71B_DpxCr-eO1GoW1SlP+6ky9$Vdp!h2}l~n z_dK=e)k)KS&i-;jAJxJx4`=Ox&m}lj33#9Z34WLi_>$0WLsXa)7b#N})jQCo*JNf) z`d3Np4sG3siKQ-ldhNefPCWn~O<^&?Y8$p!B5@Lp`|UR}qqw2EZq|FdqhM!-EVz~w zb1tWwr83^AaPX-2hpG=NcVd4)=6cGf=~bqG(Ow1s|7YYiQz{$MkExRkv-n`@MLc0s z0CG{bvh;);Kb3k1KPectN?D(2q38_f}w)=SU<>kSyIj9;{D>sJvNnMYIO7W9t7Sb^i^Dd zi<3U%0o#@R%mZ9#avV2uwfEi4Lo2NGb2=Xoz4j03I;kR>V?0~YXyA3D7y za*qRP;&FWm-tJ(c&F$CeClriG4hCq%Ftdr)0V=5}-<;4_qy~MWz+;9ELb++HnoY6GAeIYc_ zBjmu4(``4;UgEr~bgIu82-gwn6h7@ruP!)C2ozmZ<^BfQ(7inM=i4{`HvSe45PuuE zi;bwf>T79#3q43O2iFmM;swz+Y<@zR=l;Dtz2P~0&qk(@dGuU_3G#U{k6S}I8XZ7o@0nRTp#L1EL8LdyaQ-emuJfD%KWgn=v zi-#_WNO;gy;7G_?UN!w3p&uHt4y$hQz0-V?k2!?q@#7yO#Jt-Iu<#7{1^=n!R#RfOiufZ^C z7sQw863ZsCW&PnZA=4gS#gLl<46Wsa$5WzU~a9NyRp<2mwct&)ww zX`T3azoIEZ<;Zx>5>jV)hAyegi#u)uENKjpH&ym!NSApktt16mQr^Yez3q-`jbd4v ztgh@>~~ayMzdv7l`~ z$%!`ovye|f5QX9KrP_UPl>%{Gq&HQ}iAK2)FKT&#{}vlOzRQIMiI1Bu4A)jTE2;Rl z$+D^YNIs23g&7*Mr92{4swLNK=2!f9o8I*x&W325OmqjY@OrI(piIH?Bejx@kIc9q zkYpoz7g2T+?gs;(+M|jLE=(Vhzv7CpVV{OczN^|0T_ue98OTu@80N+@$<7q4-X8Kt zn$xV0zjPu4q~CL%lSN)-Y;PaLKT3FH0K}=)*Es^BY_ga?(%Z1Yv`=m}7Xvxjs-yo) z-x|eM9@i&tpSZBIHA{?k4g{Nke4W==)YFGA`6nLZE3KKEHa&}cs}J@@w`>@5dV4<1 zj#NayYglFd%z%+CiwB3|aQkP!X+(TVp}+V;60O-&!}*cctVrlHz5dD_{BTC{tWHnr z?QT<5P8Nwh$7x%AE*&z%M?v`2-Rbu1ktq`HB@LC4zOL8TO^8{{_mcbt?Ll98@qx~S zWpZ^C+ZSW^>GHEog*0cwhEfgP$5j`#)>|peTGLTp{-2-62&e@r-#twC;~^+L1gw}< zx!DAFnbiaZHwmAV&eKQ>0Q;tTZvJEeZ#{jFp`$kPIxl{g_6QF>T=910g*8+=not62 z|DMcOrEXS64vxgWJjOW{>k3`!vzREUAYsW^}We@+5Nd8UlnejQ_ zPWbbcM_bK6sMmr57Y+rMd86r!Kw()96vkK-vZytblgbNbTt?X{IS^R-x6 z(SWzN0#h6%lt;;4uwdttWiO#|(00pT@u>CxpgdqxAd$Gqf-WH=J|MPqP24MA!<*ss zh$r#dFxUa?Oe9EQfI~YB-JcilyC2PjTCq{1Q~U+<(E+pV5qSEFbGk6Z(U@TnOaeA) zRzxBAQurauFdTVL(UAC5U&KtpBiL?L@h6GKn*=13gD~o>44%?5aC)A6My5n&a0cN? z=0rSZ3+N6fQGZI_@{O}HJr;g=n{O`I2V)k?K{taVuPCN+*n`yUkZ{u$%j2FJK)@+2 zes8mUHDlH7uL)pDgpJgAi45<^=>_FnuXmo2T|G@_m5erTCx4s$ETO~7{^sO3LfC1- zW&8uGseE2KXBmv~C<7#c7hJ>D!CLIicv5Z!G_g#GI!A#gbbt+26 zY}DeawTnIw$`yLv#tr52e~+(G2#$U0S_8Q+&w!Gjfuv@}{5saT#Wsvc`V_F+NF{TH z3C4eXbubE&sVm2gZ3BA5GsiFAHq%AAU`>6D8CUFKD_s0^eaQ1^l4qLgsauP1_x;Az zg@aIMjK1T(uU#O_%`#olA1ypb5AtX(;Pg66jR8pgYigT{CipQyAre13Qm9j9P#pvR z3RYapCz_QI>9msn(bUBX`l;b~spI?}#)|7?VKW(qSSazj`A~y2jZfQ0Y(Qql>yFW@ z!C7I}M>sy*{-jA;03dSi@0gqsS{j)bUfRqOykHAfGu!R-l2gZW+3nCcDofVO;%|ug z)bt_uJ^Pske*^xfp-!3z_>SUuA$#9JQ-1@fT|gie*28a-`ID8G6Uz2xz6_lK4pS1k zCCq(e01$=j(kew{zZSnPRW8P`6PMf+xYEmj+$Z0ASR(0km*(tlOq z>_TXlpBGIzoZ2=@%PxZ<(@h^dYg_&&+HIh*RATR*Ln zNQ}PVvBV=%*u$)*Xj?OO*SDfA(OQlCw}&pmUwPyTd_wVEr{NO8oAf0yC7jgs!CS58 zgw7JYAg#=ayp*HWtG`A3;N2OXlWK-DVe&%xvBWBRGk!2+jcM@GF9#VK6mCp zA=rUy885$h(oq9=L$x39?0=@SeoC-m6qStf*DpG3d}AY>I%vLHagt48Tj?Y3V~ zAcYuXbNI&#ps7K85rol)?9URaBhSRFs5&1AGf7vJ`F~xZJgTE4+=cCqZ6&^3RT|+p zumHjy;nMZ|IQ~b3xLEUZ2E?~0Ui7}$0q1uGJpW!nDx=qsG+MHZzXe;oGSvbUi(?iS z&40zCq?E!UMZbH1eCVr07rSa^O#q`Gk)kQt;c`#WZ}K(VlR)YxkAe$s)+Lh}S~8~? zjNT7a=mjSzFtO`W-s!5+@M-W64PT-_+$Z40ycVix5H8U4(c-NVnw*wR@S+hG2_lKc zkJKt1NK$cFALX0+X{VH8Y9LZ({BDr58k`z5%8yUTs25} z+oz=5Ahv4w+g)jiM@jL0Nw8HZf0QWxme@{xkVRzIQ})lFVleONs5^IoS5;W|u^-zQ z(KgvL{yo_GtyFI}#%8)O45a#FNNYG@>F`w+V)5f*$wz8NQ z!u26HSn3UdV4%hu?I%x6p?{bn^PPnVS{3L|F8yY6emGiivVC|GB;|>l(D)Vc@JIA* z>`pZ5c1RiR34;cO9ZWVvPP7jFl?m|cXp^qpuSxSOk12drlwcGbCSg0GS6=Dg#|7PA)Cqu| zYYs}+Y3@NgL%>6|d}9HT7{TN`WJr;n2e?PyAbP-S8Z#>?c8{3+X6R%;knodKGp+%n zy^Y{YYyf$bpzl~_%U$U7pQ1oPIO_`9^bz`w3J7W2V(ztnAqE8)6~C3qfksiO#A=ZK zEx-^|0PCBd5bwY+I3hEhM~>65q_PKRx`!^^Av*$i<8z4fs&xunS#7yL8id)6 z#u5z3NzHPtg*&u0J};aC{PC>YWi#0Hi@7h&5jJ$7Vbo-`dI7;l;2DH=K%gDu400=V zJHv^9X0~gZjgU!_wW^y446T9}!8W*=sXaams%wDK@lY-4uF_IKBHZ;&chT1hxpWF2u$C*P0ORBjq6;Vm=a(VX;c#zF_l~ z!!U}yO&8U$VdwGw*To(GD}-rqo$uNeF&LgWiCrN&3WRI^v+X^0^iz29qOBae$Ii?A zofQ?ROZILZ#u2P;LiW~nf4&?fsn2Qy(#FlB;v7Z#1shgLZoxEN(11qaDV3n zg?e>-7MAR<@yu{eL|7UoXMT32uLZ-MXm8242`|c|`CkbiunND<4!cB{4!o{R&hhZ$ov{pMH=wv{@e1yA^sY@{2wQ`!JzzU+nzy7m{y=IRy)Uz zMj4GicKq)O5b^~T5Jr>X{|apDKJ^LWj*kAENXsBlP zmxyUQZB@K}vBMn%h76kFf9mm{_i2*z_SaCoGFoK?YW^+>BYm?JxNr?Ka`z@wGH|#B zXuw#gP#l6nfr|gTF@mHjz|SgC8!3~5l}6*fh(`8um`IopxIi#rnt? z)X|NRGFm1&Fl^|v(^sQ0JlQ6Wf_xN+2ZB$qc`r^=#VMm=!h+N%skJ7rURQre^M%ak zCNxO#mE8sQh z{_NfuoyDf76fqC)$T53Dy)*KT`+pC?^chfPJY_z@a5xyqBI-WR+0ajo=U#ePf{Ds5 z9d`gc=St9x$FIQsv14Zp@c*8al)$TU5#Hd*qy^u&>qj@<1l6NH?r4n;bRks#-599j z$lPqJe|ODCxBk0OZ=iXdf%d!cH!!a!NIMEKfXcb^3~La~>r$B~0dfs3_yhvMQhreD zk_l>Z{h$5yZ-I_Lub)%!AI^pP$M>k0lDEP5(7%hEQU>o(M6q$O2j*Levcln6sABJz z%q#wZlt_0s2#736kwq!702KrQ2@&Z=kX*EaAl)q;i*7jcdH3G``S?WN@_p=Q;KS{L9qw)qgrug5MF#)_MLvR@J0w5|kXtjrs1!&}}M{ zro;Y!EMf%ssGsPH zAeC5f!C$VBkFwx{x;gxJ6Om9k7_0=F`By=|eth&0`88;~a@7V}McNn3-2cZavO}wg z8{G5b&Vt@P-ay_$63UqZwPgTy{WS-;A_D1s;Oo%UWFE+qjtds#5*-ClnF3IbX+ga# zMkLgTx&Sg*>372wg8qZyPZBk**lrvd>ANw^hWsm#TIQo zjFkhO`^##>k4NCsI&9YZZGjK}HpDmpV3G#EYD1>Mm!4r&B4EWuk?$;@gS|vKgJfVP z1DgfnCZ-BnD?050<97of<cSU7LCJ@U46~C z4S@)7xet)*=VFw4F%0jAsQI@@q!FuG4{`&5)8NR~M5R6u2aYWFB+?z$8yY}u6brE=0ErmmNUf)(Z#QdXJ_uf^VLdZ0VxXzK8^`lT3t+V2=WWc_ zp9|xdMjo1>mbO)1t+10C_MT*btOHt@W5024X+@4F}YGs|zqbOPJgO ztmX~imGP7X?Wd8|3E=cAGo6RxFy#Yqq+)srYnK2f2I$BJ8zA{IM*6zJ&P?2>r00N=3myb=eRz!AvCYzm?(rVbENQKLR5h(O+e!?|p@pQV$(r~LKZGTH^i zqvDZ}4IT9J*uPOIaL|v7V;RK4fqQG(UKTinzK4?QfO8*%<%!Za zaA4@U9QdG&73YD8iaylU8>|B!uP*2tET=|Hfh*WBS7u-~6n!n?v(g)J=p|+gOx>PV z1DIm%7<9hbHGH(7a*|(Ksq3IekC6z zRwM(g)ztXsXt)_^DjSHQZs?w&Y$K=-`d5tUgzz$pjIz!A!5N<1Soy$&T-LZkMY0~8 zCOC!~_ej74|7q(Q_h1Q^@*_&&cjD(yGEmz42=Lh{^0{h}2J-%|w}ot!I`6%2@aJFf z=@shA2WnHXvLt$s?+V*s#&AxjxY!7?B}0$)y_4YJ;?9*0M2@Ba+*vV{7BaXya!oi9 ziGasHIYjmR!nf3t0iSGW$Cy?G4+1ATAipb#Jdn?0g>RtQHI>0#V>zNqijKd2RaF7 z3R##KQ}C%ZqbTVrQ2mu6P142`k>HfGSoJVI1TQr8BS+6qpcisXy6>d)zn8q~F3LzQ z^#?qKG0@eQGa|9_m{kxcTClWf;NlQESM8DJRuOFi)HM2_vUnax0B7_51#%pVA@#}; zSi3a_spj*M(&w_I@K6E*!$W{XaW45mEs`^7Z$4 zBp(2;`RV2bc&*lQHwWk>326meMuoX>=ir~XTebn7In>?_&d?GBDUFSHM>aVFDQr7KbIN;4)j0H0sU*doM_J8MJeK0Ay|(n(kJi zqy_~1-#`Dxs|J8E)(Zaq63|{`euGR4Hvlt#(1$SSm6PJmXFx6=+b&pSpk=+w+!+=u zv;v7Fn8$z3jcT9D&*4$rSvzi_i=F^s&IHxqq%k}UBWV5&`DaO(pop#c*$oMz+QBSk ztp<0~7w7<70&D}z4uHi+zK`D7(f#y}bavVch)*iwF)hyM(Ywr3klcoY*#WWSM_Qz% zkH>9eHA1_JtjT<@P)Rh+XMLVkC)g__(%xm*9yJpV{!CWH7mtQT{*h`{3^47sKq_3C zFQxRxhF6>D`#OLOV$m!N+&D*lf}klm7>`C~xP~(R>{FThD4ufWtL07P)0Ny=Z!VBa zuXvgc5!z3vpDRS^^fFVk4M3$-)orh1M{v#B0`J-PP+7w{x%CSaPVsM5g!)01JXFG< zPe6vy6rl$9{AARtW$V4=_as*kzROod@r0{tN0H#(GGqrsb>y`NfW-iC{Sdly(SMx< zcZmCsvz0V~svUG32CK~xNxBD4i1(~;?c#zAx9^+v6=WWp=0Qgz$HAnsQxUkMG?7=enS)1ZKz46N6$dF-iUlk%m;`;MQhcPtEWrC= zIPZh!zS`r^G=jwiSw;8?m6TyHB%8SKm>WjLw78Tu?7!hsdi&n-5M-h;hj@8WJQ>)W ztai1!fQ;WLO4&kug6_fJj)6P0<;9w*+I?-Lt9})gjn-IlpZ6}nItbkZASFOmTX^9? ztk~=tUXR|0MK`&2)Kl#!4iXq0;dBn-RfgMueowrVDhG2i7iRYMP<1k*;yf5+dK8>r zZCc)J_-+iV%XOKN4VD$e-KdO~Mb!u6^0@B31e~h|Dg&cdiyxwp*G?ml#Q&6Y6WF-z z11=h)IwP9b8abNDMvO#(S{ z)7G_^S9?F|?OkZ%1_0GlQ(=A^0R)B$o-9B7P%!6LypehJjwTd3fcynWUyGF z+t(!QB}gzR@lAvoiTpg(^B)go=t1H{mmw|tNB zpfWRr30zH0u@cDtzzkZLZ0yf~9mKe%%cqOC@V$z(MHD-MpB8V${x-o~3?p60o^>c9^8zK^)HM`^7-Wj{nh0o7 zME+U7p#2J0t4v!Q@AiB9V~;2iZI&D=tW7(T1ly!K1`P#Is{MEwglMS6EcaYdJKtBB477(v;o2 z?`cCUMl*@S4Co7g{eORyeT~c9FxOd$lZzu5Z&DG3^}Mt;`1>-J8)m=~qnNTHzQ56C z@2BH{&N|l^IDOSFA+9uO5(|l@DUdr~{EVvUav0OU@kc`*Kyps+1>Z&TD)Pxb*)Ub( z%H78dy_b?)brIIjoJ*z@;3VBlV?*RhKcqtL&P%gm+*3mHK`_bQ!~A3pHN-~Tut7!W zNt3$0(1*H9d~y7j0IEee{QYbKfs53y`%0qZ?_q9`$u?ii>>jRgN*i*FDZS@*V`Fps zFfso?sS{{g?RV3kA@TILfe#(4wl~^3b241M!=JuJANh%X$D!y^ObRcH4e524oA*Oc z1nD@7<%K@I_9o3-Z}t8mx+sDWY;0{^LCmomb^=Q(3cp9s`1JF z2|sTc>u$%cp1ZqVS8SZ_zfBU18RtlSO!8)ugL?P=U)!fj0 zU&&i{9pz?Fo~b?0>Lg9X>G&>)VKqHE>|>$NpsUg3W=$rl^@0%jbDTblPW^bCr!z?u zw5eZX=aU;;0r;4S=6+iiFH;n~-vdmXUrT^r!cSA2kw9nRrk486oH)L(^*sFhZ4ft9Z>I=)b@nz3v)a z2#a{;khcwJU0cF_OHxskl~kLbQu_ShIKmw>cf(gzbQFSfSQ;Oj2S(dv+`6TA2`70b zCWq@DL1aJlo8byR3dR?Xn=KDHi&Av-P}ui7I*6E_DkziBn4TrdgUP3Rtd>HCa~>OR zy4=;e_AGEa^7Jr{=a&0u%h!z;#lt>F^!D$@C1_N>YaU97PH9Sw#d&l>ru6D zVydK){6*j4B+^MSMGoCehY4W$4gXpGOFQDpoLApPUrYn<#+!hH)sPtxY*ySpsW4j| zCSKUW_bf`*yb0eCbCSp0Kk@$tHwi9K&Rp7g&4N;?PLiuJ0xNbVMBsP*Hn}Wny8Xg_ zr2~lRF?ys!ZW``j6hpl!pN<2w0w|L36vIyjA#`;TS1*_r*iGR*%o9HW)l%072K4~a zwO1a0;~oAfm||M0$1Dmt{`?qK6#f041EcnKPl(eyx8bQx^A{5x89%rx_KNNFwC5zD zMib;OV?Hrdx4=6BY`3+GMg6RH3bmeykBNfD8cjup6$@K$%2)rPdLo`_i0Zswo-9Af z`J|T5$f>0Au0W%kiIcub-JIXO_0tpe#TT6F3L{Wtv^i_wA?(>hWF`+@ zTV7^#mkO3cO=~~b;=OE+_9VzRKC#T!K=d4;2{V5bg~6FseRu{b8R3FMtBQ);cnims zxi^d)@7|H$SDJ%C;!GfY-@K7|Cp>}sB(YFwjsn>gw*+F?o>sgp-em?o+y+RWA6Z>t z##7E~KTzvY`TE+tgF;b`oP>vyBT1HKUlDKNYrnPO_}zRpe)b?!#de-OdEG^8{ZLcH ztP{(b-8=Y)A$I}5O6P1(mrV}j)R0a-tb@nuE%tow&$(n*`jC+c+CwnmG!NCh2I_BK ztJiEy8XAh7>po+niun1!D8y_|>?Z1KLZar2APE3@_<|ztqv|mXsBkA3&h1)*bm zv6pOOxb`@ol$U0J;5@5^IE98g#Wlqz_QPG9P@!Q{Il+Gt3uMfC1@^{q8R`*Y8c4ry zz%+9GWaO#$813GvPGVt~^q^`Hv*I(po}({7wUf6C_%Eiv5Tvhpf7fr6;8-6JFxq%% zgNVBBR!;I~iB+Y0)pQ;)3FKW`6K( zd6rRnT{fH2XKD$%z;7i0)PtDM9BZk-?=hf}{M|`*J`mr!zRu{?O9rd24J^Df|lRYvf zfpKMleOX0c>I54ZL`PTg(w&)=<3kLL&%A{Ala_b>l1q;ahqOeOH7nmNr3l%&F#=AJi4P_|EeUf@rUd?(ZkFZn z+q*XCGn>WCCAAtl!HmMeMY=6&xXeC}m}f-paNA{mixJpK!1*;F2vi6gs$Qcb+?(i< zLT81DoS*N+p=&jJZF=i=MERFGj~`63opIte9xZ9{;kb5KfX!>yLH>6r4A6ZlUs9`p zSY`k=e3G2MNk9E@1dKX)xzIRiMF0gAjBbSVfe{_M6!u*u76RPiebh_P6+ZFqODmL}eOuauBRM>=FJN0_N!HBy%lj(TI5=r#?PgGxCm;5w z;fr(G&(TesA!WSkP8JKgm@|UGft>Nouo_yDXhD)pmQs@EXuEV1Yqc{3cwexI8S+1v zd8=QE@GsMsh84k1jqF2YLstnCCbS&OSsr$rPv6Ll$ zY~K02=bK9US;Jefu68qHtdjX$F_YVR7W}8xXA|1A0X+=-(L8_!kn|PcH;9+s|X&WbKkNM{vdx_uVw zFD3F8>s?W8aQmJ?XyAzqs<{icLyafkEHn=0@`pL%n=X`|bkE6`7bu__!k98W?FgkF zF!Mqt5G6%wN%>0^Z8UEn4eV6NCGwx~J9_ixUiA<7)jcjW247QBuyUqWj$dB`mh>Ar zBCvk{0>)o`PreJrNp@(VCUBBrVe3~MhS9TI_)qBYdO9wYZyJD!K>Zt-7Hs_PL#MlE z`&9)Wm*dOR9IlmSk3`)H;SyrECt`e4UqXPy$SP3e`!Y}X^r+iyK2SVWV`7-{h!q(v z+n=W3z!XbcGUf>6h)jsYJQ^Tdh-oi;R7g_Mu@(g0jrxZL;?1BXI=pPbF6KGHy){h0 z9!NUdcX$CTA7-P9#BFAyyFS(ew!I5^%lBEw1n^IfL!*6o8pV~?(L*Ef1V zb+k2hcYy+jV9g8woewSKgV|kUV4dSH{ej&_P91+=Nuh2x#dA`n)ApB+i&oUis}6XX z560Z**T`k>ROP_#z9g@mnLGkq9R+;=n;1Y3oP!JoBJ#Q-P?nhxqt?)pYsa54ncmM5$FafcI-OjaI0H&E- zIrgR6cirjPlu@Vj%>0=2PoyjqU{SX{!cM3o6oW$V;qD17)&d?HY42UNptOn$Gi3b7 zDGO@6%&JvfY)@QfF)pH6M={S4fEqe@-RFXJebq`gIXd!?xe$4D+TMyGIc6%ih@e3* z`^KVsxk+>E?az90V7F`TtmFTBXzZCb)OyCdp_ca4^HGHI9;>f@VLWYmept zvOK6AT7w2E-Fsz~dJ51AfBk=&5wP(0sz4f|La_>9tn?GWPmNTDW`9Oo9k`k(RrA>p z${w&ZV0<%jN3eY*FX1hb5d0e1*}QzdH{Ul{>8O1%&74R8k8~y=*VylT3d6JZVaCJ{ z_NZUKlT#q8G80qm#6g2nyB~y1Qucle1ED!^KM-F3k|noS*vAcyQm{z&2E1uxxRsK##0DlAW4c2S@(uTVRcFMqI#yNp97`#rwz z_QOQ9(ntJtn6tX04))QN%f>wBF2u6O>&t{+gLmk#CfQ~n^sU>{>2RK?azpekk` zC4!f>nK-R5#qs~aqx;ue&`rV?_^f#X!j*KNdwlrkFc}kFTDZlaJ6~?^7IUJyZ*+Nr ze#4334pqeT@{Y+6CFm3G|A!$C?g9ti?sn()sqoE{p5DLe8vGBB5BrYA~sMN^6dc!`)nso9fsF^2myDc(ojGbDF+WE*%)dB4%fx z)7&zxjqmUty06em1(7)Y7Qo}g6FBk=h{9JXyNxN6zhgD!J8GoDwJVL}YyZ7;uEi7z zKF;vpj_fxPza_jTQVG2@w?tKQ2y#i64WhH^(-#%>$k}mMXE3hJrGp9=U{_ z_5sWrot0;R4AQj}k0Q0#&CMo>*4mf!m@hwuUhFqWCmL}(rLPJjgb_e49SWLNG_7Ff z<<#~ntM4BK78!s^e}>u+Pc_+;+TWo#+=bF|j*Gi8%s~OQU8$;5CehYgIA%p4^ zI++=;hlWvr{Cd)cFC8&|Z^0(&@;)wWWM68D`41O~G>`gkR6;&0kNN1+vK9UUCT^u~ zS>1*J!u^~<$Oax1qZuTe@tIxP4syLppTo6PrEM&GeJM_h6D8Mtcll4<&GkiLs!A(S zR#J@gau`1E_`9P3b@X2#Mg=D#ML27I9*feTq+wrUN}wU;@wczS$OJk?Jh+;U1c(eP z-U5?@#%v8x=%v3ZyY&II0oKZyD~mwGR_1@Nyq)~~D%AYqc)M_yeK)2j3@&Qij^W=* z@NM*5=*5UM5C46)nzsqofP2A@5w=y{Rq(l86$@hSrE7a+RKY6YR9_uhX zl0*-p0cf;5aWjX0BAok#O6_!c7S14_Mz;3q+CB*m!KX1SEcA66$YP$oE!_(1VvhdE z#MnLFZI0=*L{e7`>9BWh_=P~irRBRdUS5!K6XB+k51GnmF|!6d1%u>E{eqG|G?U%f zCFE=hP|SDDZ@|m@)*t?<{3KDbb^igNtpck6ODH*$XD>!gqw2#g&=H*Fkyogye{WDb zA0Q|$F+tN!)H zVru{HX1{Lz*t5_ZbU-AsS@26Z$MoyY+d_LSX-?sD9Wpi@5^w+=kuLrhMJ!a21qJxT zn?$b_2_wR~88A)-9RTs%zs+3QO!zA^6)!&qBoaY($(}~>{KT>9P=3u0*uX4x9ls2c zrcVdnhT~S@qX*_m=> z0>Z;tZ z$MM@IA{EeP?YYek2-!NsUvDKa{P7nw<_aX;VQ^)6^c-_7frhb=!zB@=j-mXM<$rv} z&%+Q=_gmlGXsa-&4HpF5S9|}ds)Ocx7lvL?f;$;q_Tj40N{EG!>G`ixm`g_Du z@VqO2yfL;t_8M?oDX+yl4HW=SZ0{{!pGXriBqcZpHS|+34FQ%d_w-ZCyBN7`PS`AD z@mEM!$VkhZyuF(nov=wuD$wO4^oQp$HmToAF3 zBbNKGG6a=9&D}Qz6Zl|v)xJsy{B#><^)opH4SOSidG-A*eMj_x34*TvNt=foGzSL9 z=m34T{qsm^zylb8hMX2)aE0$T049zW+u-cm09KS)0fFPoXJ^-7aQ$@@%!-4cxnDJS zbzK&5=%c_8zd{mBNjKD@ZeWGQHBU(7F3U{7cNqa}iV8mhlO$j z4S>y1NMjm>%h+el-FQV=c z8g&BSENc?qy;KrOf1F$m;g1}Vyc=FRUpz*l?!#KfYY4Xs=5OIpaf%^+N zp#C`@*N}ia@1Jf8!2ffHfH((rPtXCD`_|L?3z($+bOG*8`b$56Kz{@*jFGS0Rwrcn z#T1BAxT2*$RDTCxb3++G7cqen=k$TMa}sGf(;gF}k;)EWk65Aw5+`RkqrySI zS^8&(K)+evRe}Apz4c5~w&$PK!MU4jziQw%kv~!CXey2>zcnkQ7YxEzzJW?Q^-(|r z6y(;Oz`iY_9VJf)YSc3e?GDfx@eJ5|~>1(m?(zcMKkf7)#VIsdRsRNFwvpz3PvOOIA4b z6Oe!xBMB^`sIH$qqyragJ#ekuENJSz|0`cx_Dm_j9n(E-gbML2++YH|oqdJW5VEjpxAwpyJEL0LmbIF;EtG@%xQTghxK!`4cn!R?!m9CusTlr7>R8p_JU~I4ek~s3@SQ%etjo&z%~!P^oUww{H%$Afm8Wy#!!lnov#|47BpVxv zWm}oF*B#b2Uul-UrzO?)k%KEZsHLALN<}7Nv_KA zRpnG**{_x6H$vKuDF^Ir8b$W9K&crGPQVW(kD++`s4#Tro!D9)f_!+LW^i3;%k8)1y+=U_` z^Nk=^K)R@!_3=or{4Mz?AduD0Mn{XQ^2KMO*>tdKvZRIiH7L))rA8PazdiRT2Yb!9 zRGsD7o)+ttWe%2wt)XR5^&N4!n@b;=)r3+)*I&RQK)@HEJ1z7yuHIC$#&yt$MeP%>d)+`A!jZnbjS%&ENLbRB?oC9`2wC z?jn*1eX1;*gC!quNuMC`XRTq67K21L&22jqq)5wLzbx>QvzQTTrah{ z%oN6z;7#qcD5)5@HamBPhXKTK*Z)OnDFE$tFKSi5aer&T6R8E=1dji{3GQQ5{OMN2 zyscsds8suQF8=$z9!{obIb%thYUU)qGnpVR^JSuC2b96mxJ$#~bx|Eyn;yWQ7L(zY zH|0>VZf{?A)GM+4aWLO)sN{WD8?jVxoGNl0{^DNNtecFmfzP|X<2NrV7Iq-ZSVF*z zQKmZTuse zZ6u|Mgi3}4e)$t2KYDWl)HSW~bq>OpYO}HM6Kp@+2BQcL_buE!a2Sn+CX5?gcHZwF z`#kK{HTMKDv)^Ersm6ZObsQWe>qrVu#X^GF=Fi>$@|loq>HgQY__GNS1Sl$gWPc=m zW?;zL$d^$^Lry+2N^m>LG2TY1&dfWzs|RV{QYFA>;H{be0_K0z^%OiV5n@1-vl%mco`m z&Di>iiK1p3m2rN(df&~w*}wzM>gB{o1%Mr@2j;LLPrCb9=r!u`r43_fZb_5Cx12O; z)=3r|0lAsphi?5lsM*&`FWB|3>&TmoLX+_uyyo9?qz&NP67inCW~4>Z-(u1~HSy1h z6&=(kv)KYZFe9s{`^*-%vGu@T?h40g8#~OKcij`R?M!*}H`qF^w0+OMjwjj7JDS`^ z!*U0(2Pb`a3K$2td88L6*ls3*xgFl}Zbtv(+ffqDYDBfmbu#NPrx za25oe0H%sB5O}YNwxI0}0De~yDTbEl=|6nb-!dm=uBN@oP{8?^-_!>EKFOpaNetGk z;>s0+Y~c6fPxp_WF@VJ3V{xIAc}9#PBg73SSS zKze19@dL~H3LxeJ0R#&j2;uH~-RR-Ix0uu&g7A>M1^1@?u$MY7@H|O-{dym*z44>M zvXDhR4(;2ZDsnBuTY1YfKzDEq=pF;L^FnZ09WAQ<51>PmG@S~wE8 z{U|~FUaH{a6b$XEdo|;VmWwBtfQy3sfx9I57q~Oj9Q8J;j1pCa^0zQ!G4U$qulbxX z7u|xD>Y_ZB8daQM%y_MmpNlccLWULf0IaWao0ul}B!_wifj}i;Csxbd3Fizq58jGN zAN`iQ3FPD2=%I7`lodflPi?|@5XB^$g+eLBL4%067=1x~z-kZ-Td@;Ay&{Tty9^QA z@*Md@81Aw{2nHC-y;hp}k4Q4_$lFq|&9hmhFf&EVv*QjQpc4A-m5H6>SQ^QJrssH* zU?S#_<0&G@W25fs(Kycqg9X;9e;eh*vmz8VLet|wjd`ZYYe&G#&i1a#T)yhWvy(!d z6O(R=sdxmj?`96hd8n4cRnJN@7k#-w9=v#eS#HgMzp3WKP44C@>H`9ybWGPoNvYUg z^S;md>anP3F;^5RBU97e=Z|EhK6@0Ro*$V2N471a&+KIit%h}{E_1L4tzmc90o^In z$deLwGjA@4bxi8ry>Uk=?`3X$_10Vbl4RmeGy!&)RUK!yYsVb5kD90>-=qeNxBtka zmF7I}`-=z}A-~>a1I1&QqU5;HN59T0%?;dmDt1%F0R5;L(B5qc50fDa7VF@dmHi77 z_8PPXFpGZb5<~2BN~C(f06YDxK4f>XZHP;LzWo8?dWg{*w;UBFEgMqUPf`U=gj&-lIO)={Q&U9N4(F*fS1Bqt#u>WK-*U) z#Xv1g7xq^I#b89xhMS@(aI=y|#v#GBl{fYem1K%t6khJU=0Q0T>HV6>Y_E53`O)^9 zJ~=%c`rmoQu=JFvb0be5p*Xj*g2|-P9{TfyhTBx1h(odW}hc9j3NXkp(gYU!F%kKdb z=()8l8XvS1VT6=Eq(L|j5XmKWH!OPHyU5OdbQ*P{qHOB3;4vBz{=DrJ=;0NG51dUY)8YEfY9i;E4w+<{SLpbCPC`EEQbz*6 zBqmq80jaxZR&LE}g%+(2&3`CZ7uzpN3!-5~<6hYwPv9hq?5Rx(l33wc55<+mrl(@) zgo}cYMqjVxSiby^7r@-rj-N>rOyXstUT2Lk7t5!1*FPKc!Dv>B1EKjUG9d|O>gPci z3yDe+p#LmpS_B%NK~l@bkIr~A;?UDfWD8uJm+_eX9ua)=aW46EEysX$L63k@_7@~# z+P5pVS=T^*H9GG7 zcSljr@cA6tsAuJ`F-l2n1x{Q;l4?6GqX%`kZ!`5ItJL9saox7RXSMl^f0$N$9Zu6WiufOZG;czK8VN6wxZd?)>Rb6KGylwm=XGr2B={E#Xnhpx)GhjsAG*Z*TSW7A;99A*phb3wCeN6TT z<};wf!k4H-F@5g7Q!fc-4IxE3)r?+EY>Es)mLV(s zYn~mHpouMev9!Ky1k9Ps7?o|KGaEm6kR0!fIDBH@Nh^(e-fZLv)WzBLtx37)#+K|H!8Yw~lM zTJ32>Jkc=7bS<3w3RF$bX*l>XUKGdelcAr4PaEOVuG~AH$l|H5EG~XHKZow-V4BXp z1qvF^8(3n!194_9BKOk^c9z`AYdNgoz%)JK8cK?Y6$A4tL5L+}XFCw=CF9VWl3KxuUQ@hTiW`q{Fw)fEU6XOsKu414 zV1MEJc*8{WUSk}i)P@l9hZ=c;*xmXMW9UeYGp|CwD}WX1ue0>5@GaviJk{@-&Ogy_ z{x-J3-h}Plh8RJzI+HNRP+k2vnB8W!Fo#@HxYCgNWy2K$ygw`?J-Yb}byCJO-qqmt z*gdC0s=oDo7zFv4dKl`j-WjH{%hfFbiE@RRdojY+Er^FW%4!tmIHx(d*7j2@?Wv~7 zGR1WN8r*}Q&;Bk=FYl2dyKeF~CewvIuJ45?!wnz2(D>Qr2msUS`>sbm;h|`gZ~7W#nfk9`Y3L%;w_76hXoUE1_{B7L!39iI^v%XDIA!fh28WtDZtM zIkj&g33FE6#@X&qTNg{K?JRV|&E89~yaG3z<_@9k3-qd!^HQe!YYf^o< z9R}4xq`VEPnAz;|B+L`l*3Jx}kmVDGnJ8|x4s5LD*PWu2(#<`yyyD`OV4m1C6pT*% z*=G}wN^wM!L~ySPapm2pOOh#G!Kq$*+*1BVMVyRHb(7gZA4$OjQ&czN-PR2g7~Ko^ z&-wCUER;jHmPr?io`zyr69fbBYm`HiTiD*-eWI(Wc;_4F`+v<&fy@W0LlWNVrVX*9 zp_ZX;V#%M(ZIi;tqgUknPmb1yRIRlZRHJT%mvZPP0&h=W;Idq^3t&0ay7xs(op46RPlC{kqa1GcFzLYgZyXC(RfMpw*3#C> zqODX7ZaUL`GDX2TC+42)y^Rn8fR~jmGsNMS*!02f=-fOF2(POgu^S9H920gl)Yu>` z(3Cr^LB38uwY3GE!D&AiIkC32mdYNA4kYI#K8vaU3w&3Ld{MvJs^MlsKIp4`uv0ZH zhJQgc0Kg|puAzwT^DAMSIGJN39}_Q1 z3}pr89?M*~k**@QzI5a&mo#O0Fw%4b!hm4G0O#Ok)#KX{2|zD>+K^_{9OFnoYrPin zS_s$LsiVu-54n;EM}G>M-prj_%~BjU3ETajtY#lw-wk>RsEXeb*i~IfG>iQ59=s8g zwzc=^dJrGjzWeNwpO6n?okpA-L;&UvFq>Fh19kD@_EAU6h4kG3?AQn< zNJ`5@=7biyHcjeE9(u#7^Q#TVQcQze@CvKyEb%(z-i=>G?$Ukz?f#n#SO%%W@ipL0 zEcC3TUl?%_i7^Sq`k%HZFdkFYNfF=Fxe*(#?O3p=2d@53KQc-vW5|&0`(R>$b2>P; zb_6I7Vj~?ut>@Z^h`GyP&n~26QCxbi8J4^Ez`HFDkjg4M&@BkM+5ZYCKA(_uhMk^X zfQLYL09QM(qnJ3pm(|T%FbZCDmAyf{1C!`M(e5^!I-lOl_kxyG=k+wF7{AhmcPcsh z!;6NmSVG>w6Ngt}rDda^)lwAumsejqM(mxorp^mk8)aF@n8IJ$pI$ft57(f`1!F1$ zD0tzm$Yjbs07oY-Aog>exi96Q-q^)aX^49!p0m{yGK{;(47^4)O#AC8Ph9V{>=M{g z;1xQiwo9_b$CJLB1#^pH+0%4*sZJ8FBBjfOQJY{X>N-_|SevW1{hz0~xxk)9KC`nW zA-xx)<&Yltww5%@ATNROFL!R{2;Um~pT}Xr1f2v-#Ri1w;4u+Ot+-PH)nZ!5n;Zea z!?OKVmH@JR3F&6JF#eFXB#+)z`fQEqLMBUEGiu_xuE}~o3ER5SO@$1^f}kdsKcO`mmO4w!>fr)1=+;> z|GHRlr*c(IYXNU8$}fJD>eSjzp(99Jx1Tf6Y*4cy{B>%;;)LzRGrUXy9*)nFAb;Xg z#LJnIxW@4ujbc#T*J>D4RHwUSYMq2LKg{n=4muA)N`)Ui$dBqu7{S{#c+wHXT=pW( z_m=HmviPRfxY=vQUMWtA^h@&%*W`R*I0+MITqo;y!`J10lKFi8|6Sg;AUrDcS_j23 zs(~G1YMK>8^qM`pX(XSp3@at&4m(F2&wbycZ-KF;4~5jF!E_GQM&ka&?Ww$?e@|;R z@Kr0>ym(kY0}fxw=R{0QAYOF?0JuX(C~dO|wJ83OUelMlT5wWbfZjb**59l6gV#tF zf!hI}`j$`W&1#v%2j5auh>}VYYyjFU$>jvM2EH>A9pwtEVb%KqR=k$EeDGCZp%|h} zQej>2P%Mi$Lo-8qLROVl{LJ6d@|N~IFFkDI)h*(I6H*H`TuM`BuIeo--aFx66AX8` zGl(>r{KrP@mYzgfcu$$V{QI7&Mnf`pN>`Qf3*;Cy^A}7ai#fX9Pc3Z#sm}qSkM8^^#JRD_FzJ~D+um?5UESphJUmT3~GE&C{ zCa1dtma3r4LD5DZJ_4xe5lu>I(6rWCM)|%M+>`PNPOYy(KEKr~K|gMogJONwE=013 z>}nIt^&K8tJ!AKN7BaF2$P5NPQO*Hrt2B_)8 zk&(Vctnd5}*Rr~nwG-on@Xm6T8^Pf6_APd?pL-B=v!p`%SnM6+7E60J`L1-hAPkxd zP)DALfIo!)XGdyq4XPJNWyy|J@bJ^$9GUIYO!)O(F%I3GT_eci4h_k{V#Nbc`q6*` z;W{-w5%V%3dc^ZzA6xNr`5)F(b*D(&#(!A*}bzQe$)1;Jd?|MFSbxFH2C z)~k039NRyaH4+9qT!0%RzC-{*3bT%y(Ahe-KCNX@DwJn5f6 zNDj#va{Dzs$j#g;dhTpQb7c&iD0Extk)&m@ywYheZ1+%l4NolneWW7o&BthyynpqRvqm#qEF@JQHyi0N*r-!@;h!=<`D3ggN+!s_TCN9cU3y}kJd$% zMQ?lnhPZC{rS%&H^#r7z-I?e=qPwCXMK~2M>z?9Jf4TZS){-L0qb>UX97^ng04>F2 zT@k@wVK`Kgr9jBASYMt!o%Wj{77V30`>C^UNjk(IWNUYm`;Ujd-uf zN-1gWaov>Yy3gKqv&JqJNXb@pfag}7?Iou_Ct+Q#1AlUr6Qjx3i0|aBF!i zBt`zRGp8c1sP@aT>t0U0KE(LlojmHKuqMvF+sz(doHAmGn~6V@+VMkC?KMqH_Zq*FL;fE z;b_RI@``l^GIb(mY;G=JQ6GLI>e5>BD+&#q9CI7My7u3kZvo4HKs6=SKo-ih_C<4B zF{iSuTZ?EtgL{$D@Touj&-yLffef>>;OI{F1g;54J@X|-zf`zqX|Y+;-LoLjy~<*p z%zNJ9@Ri5Qj-IZMsocw{lj4ZmvS@0D@EAB@p53020`nX`R3gH)hEa=yFrkx#{_Ay< zHPj~$rd5F>4qt9K*FI-zq^4J8x%)FxPfn8PZ4g%)D8+>5 zn*7FLsWbKfbkZUux#{c7X@ASM!2!=S?kIDyn0~*a-IhluBJjv_^ZVK3>?&U|lZ3Et z%d)e3v(z7=!ueAiAy1Q86t#fdjF|UTuJN?e(e;_rxkz2`=N$N`a4laPs3M=pm`2fL zbkMc?87cg}y#~^%=;8X`>f_J&vWBGhjH-gbnRBB<#EKGm1x39D#wxME>~57MRljt%h|sRby~ z(-gXy7~kM6v}aQ;8_5&n?`{2A2xBAzLMX|_{zQDy?@JMSXidy=(hEA! z!ThN4BYRu5DSTSI3EKmq5psr(rs_$qD?-*H(ov!V+&cGHe8@NR=E6SslI(7b-Y+29 z41U)B8=XmK0yvRkFdcjqW2d60lvR067(S##hWyGF8Q*kvAct!hL256~*3LLOmX9Uc zc^+C#wThb_P3m=|FSBJuTloPPptxNf#{t8)fIR`% zUGSyL*>OBD4!m$j)L;XnDV3D{w~)D9wyF4+JvyYSx7|~>*~QHu*xRz)u$KSWRmPU9 zKg-b4ey4$%&5E|DiyY#C#b!bNBa>~Io3G&WPXObjG*QszoUZ9I4H6sb#Ga?#aKwXe zye#!_;Qu8sEr=}y_Slo&{e zfYhc#kx&8Y78Euh0)m7{gQS5Vjffy!(#;l-5RmRvN+bknICJ?v@ArQ1^Nn%F8RswD zu-$vDd#yF^`=0ZfzpEOwUan9LxPr%Zu^fRzUBZo@&_=YEBs7!v5Hg;@Uze+i5cTaD zzQC$$O_^HX=gmf+!bgifH3{G+pP6ItfI9UD?x^q+(E?ieznG0*%qc~%h~EmfyRORj ziON@x$V|ZtaMu#A4CBrOFnBGd1;3gPA{YmS%k!uNs%y(qX#C)` z)n-qi0}Zfw{z%(KK_L>-RJEh|wDf0iov4Okhv!;%u09;ZSjP515&84ke>3F-To*v& zXMbEq4)Uw9Q~~c+P%6maBSOCx7W02Y4F6!wUeVyVtGWQq>Xqd}>c2Q+sfh@uCUc@h z(Du)%?zzCJq7!WHV*ijnx3(Y^%~tlx2muJZYW~8)^G~wZc?7tn^x%9IA{@1CY7Rb+ z$liI(&X*xTvt{{L2PE8H4;|$xQo9foNeRxd^glmh4*@J5+s6%2gX$>f+h(2^ApFJz zx<>&gTC)9iNu!CENh4PYuL(qYv_WKRw0~pO{v&hcL=J*eEBEzP_)ePOSGZir1;$m) zeSv7RZuyGbmIokZJB#+&U_{xJ)|++tp9e95$hymZ+&pU!C;EAGgb@I;KZf68;*k*g z34-bW8BMDH97ZZ0GK#*>g(VaLbSHA7ae#B?_JdP4?(XogV-f?j0dz+dO?TS>8O6aZ zmaG5#_G`$Xo##HEc@y4oz|C8GB~9b|Z}K6{ zf6nA@Tp~PX>|gvJA&;YRTWqx{s3OaJBvs(PPg*Q-1ZDIl@*qm-g-ZPM|3)L4T&q#3 zK;6gy@Q6p_s(JVVQ=cRr-2gh8n}s%WFIz=%{!91ugqO$MgRQ76})Om?hyOKC-m- zO-lObfM{{UVbXn$-(v!zuh&S&T$Mgb-jCHmA?04Ifa@wE*ZoGswAUj1W8 zd|x5bRGLCMLxi2?%3%>mhx`IJi;j^Pe(~JQA|n8)7YU})#a=*e_Q2St|AP=b1%GHa z`-X`GgrMl^EtfnvqKT#vR(80@N8h)_AHftzB7<<_WR%!0w!Zd3Ms_NQ1?QjlsXfvm z4-C;+gdsY-YtI65Mo~Z0&3t(2h5KL^Mz9|dej119`TpZXfLF;32mEnkrf&;51Bfat z|HhmCONlIy0Z(@H|DW%sv%x*w>Jqd4Qp#{yCKaJw{wgSa_#S7%DS&NmuyXcN9(?67VEn&KkM-8BYK9Wq;?2f8KBZ znmC0ru=gOGga*;t@gOaSRvYh17m;5?>I~We!?!9h%hUwNc}_#d5d zZ(W{2KuY>7EM!K5ej})GJ_f#$r37|;k(b0@V325I_&Zhfp9e6HJb~g@4CJ)orleB% zjzRq=q+D$QVkXkZ^mn9`v;VIzh8JxdNCdi9>X!v=lV^fDM+D(6>NLZ@6&s-G6b>^u z!p1BPgagEk_>cbM$>)q#KyJF8d-yk@3@S(VrotouEe>b?4(udvFB7Nup)T7r!vG2U)2kYTWKZZUe8lhzuFnYfxA-olt-^l~T8JzK zGM)eJ(Y?v9ok)m-X{R2x6*TmfiwIDLMPm<2q`f1V+~8&V9+LZO?^S`m$ktttIbF zpUGjzs3fqR4eE~O&d&5bVdl<&ZceC6vT$l4+mq{3?n-zevhqY2sGr+51rVow_1O8D zM?i*3MS9pDjo!~}vhNI{keY4;NXZonoTwjp(Ax9?_C1>RU?gMKvIXRCZT5)RQE1ppuoDHZx#o zDa)A$g|BSLT`xx~P~7a`uf`~BmgtG|TkEsjrc27Nm?hZ`mN}HW!wS|uqb_~w=~paS zIeQ+$WiMrU_-I!c?w+gk|BY|$MDVTu`{sC$C8~kk{W7S6`iY+6Ey1yk^;Rq-d-g-B zF9Xr(0d8tC8tqR=sS8xI@P2DZ`rLu$uXJ1-trpyBN~SC4HhUQ#q?L0PN?iDxP|Zk#it9MV4M$DKMrL>HQVfWs89xrNd@X2~7zxro3;sihb5@mfD z!D8G*I5UPQsK;2`yW&OEq(P&y-ztR?whotoM(VD+{88{UsqX^5WA+8ZPbOh#{Ht!6 zzAIbN06P&)q|Co8bFvrpM22dX+^!pTn=d+c@UOSRnV;hQy~z$R0!}^(8@i9s1)VPNsDgNr+HPf0E+f%q&w9$pS{5wvR>KL zT*{@Wz29yNH0V|q=Wq!~9-WG*0(@0Jc(|meaBxq8?K_*EfPmPwU4T=zH}hg5_GZHb z=t9yEQFZ<4$EKF5yXTa^R4jM>TR#Ljz~~1e7=1tb_RLenDVrlw7rB52Pp^g@f}r9> zcHWoh-$oZ)(5{;r9zbbUxA-=!pIU__jd}`XUHx!TrUWamAl-$tipZ(6kX_zBs)&GEmEQN-%d_X*tIl9Y5F5>dQLC5g z{jh<_lWz~hz$KBmPYNK_{F@^7akDo@@}{nN`ZXPU%I8 z$^BVnhx(&OfdT787t0~R6Q50za2e=?Q~gjfOZ{e<2!2Gb{SKiUzyQ>g7G?Yzb;tX5 zfdNZx;w8Px%;&ko3B~b`fLJKSf16qS<8Yxb1vC^mN<{#`wTQW*lCkUS(Arltpumk>~=XmNv{iT~D@0A8VHYP^cV%!Da#d7KYtV()TVI|^Dj#5R3`r7Q1j0KI zQX&H@9d>`bs61r)yx41P`Y$Z^rZ;RCr+%mZW>l6H9r(k+;lh0p{OKhR=N8h;l-Hx7 zn$%N;C@OXUG_2d-`e`A>=O;PKRl(9EOri&rAj(#usj;r73TdIpyR%{iElIjTROpY{ z9>p{HEA7e^d2WbL_krB5>Y}jb=GgH5)e(q1_9=Hv9%o3a93bxRgZS_3k5(NoCRcm& zm5)Evxe8g(;IcY*V)uqld&@5yWF8PdO?65yuT!GzCzVGUgo+Y_v&9lR-*a{J9!vpSb^FT~PYP?Z>^ga3jV!)d7!zHH$j|xd@w7}nehh6i zAtWGBG3}SiUu*q8bgnlz?>{<_>f3F^L_55f^iBlC#iunfjvuv<7Ri50ArK;)L)9?; zl2SkW$<)VepWnAl@Q#nxd{!!VAjris;6>JaBWfdb_L%$}taE8Cf%P>r&JV}wojf0z z)bXr&=dF{f8Hu&pUc$S_3vLmf-A6-~Vfk_!UxoZ1h(> z7Su+>=r6i1d$Y5#z*C!xo`M4JcI?;n^*;+O@OS^{M#9$AJddd8w{4GTw^t6J)ejrQ zAXH`eJIhep?LTqYjgSO-fcU6^H(^MVgW+noJz1t{G`E^hLMOUrv-sPTVrY_!B5uEI~gQ+&TbkYGrd z*hFf5RK788`Yvwwg^|+1ozr?|IQUU?w2_yfyqOUn(Q>SHrrx0dy_@0AhsRY#itHy*4)f%P8GyQkFY3+lI=@$?#; z$t{Bx2(QP%Ih0Rx5b&8vc5>9@Y+wHaW38CH07>paJBms2PM%@PNjE(ot?AW3@uxeZ zuRQF?zVp?rBPG4n41O3+QNU=UH?ERGkh)#T} z3-1O6!!LHZN_I9A*6##Sux1Bb8R}`0q-Aq8H}R~ZIpM&CoET*aU1P>#Jlt%VXQjO2 zXaFep$L}Hxq&<)nOCSMlNW_P%dy`b>E)9J0rS%QxIFoSqH>ow~u`vXm#c5e94YbOl zSbKV}n->!5%A{-V+@QYPR0a)A+fpN{B2iL%npM0r#TdyEyz=e`oXoNNjFAzqvrMOe z)A_mV1fWFM+_+{cen^{fa7WZdIb9FAvVw!7$x>dCOtJprX?Xw!Rjng6@>f~$Op%{} z|Bc7c$s;`?RoWehCln>Mv*ND5AUzVYW7N&#PJud@7O!Cepqzb_fPir>4|j_9caQ(@ zH%ER9ZmyHb{7vBGwh9_BmS4Yr5U&yNU^8I7r#mh4Af_gad0uU?ie#MohJn(F{0*j} zQOTBVs}acNfZJtR_cxijz`r%qUY`my{C4|%rHvbY0zBVD=CAIKyXpt=*V zUb;Es$~j-LYARnnVzYkE?l(eoG+p2x5+vh?%iq?l(o~`2Za~s&BJ^(>CwMzw!b>pL zIRn?919>1tK{16yt z%dn#2FkgwdZAds|+B+s`1!A)wZ4T7%PAcxV@^EMsO$OP=2rdLwGp^8Zy(bAl1)K;a zjQ22ehi0u;VM3UrG1X%}2Y+7%z&c+uK|b{4CH2xPZb&D-$ToDw_#ee30?or0+A zb(GH4e(Q2=!m(F{W3Z&3%VHAc0GoN;;q-w~jq49@nHkG{N(oLQ>X7q3Z_wUVG2~y{ zHC@us>mrwncv#c zq!{lm7fqR;*M?#tmOZ&zg3vr7!YiGD=vAutIkp>Rk!rVigjA?>1@1-4x`DHxl)9e6 z;xeyj&wJg^oTq!rC--MwFr4||-_(OZP)<^6e?6_r$(lS~SE0j`e=aMVp-N8m4lkTa zHaoyV(PPc{jQ0JsV2yJ@XVhqjE)l3Iz9T03N>Ah~i;G8;dPRg^B0qz_yWEG%vktaO zV{6`Pl{-Icbtj#_B!1{l7G6sj`SpXfLG1Ap*~*wIj^EpJm%=Jgi|M0Hf-qNYbQUZ-sZx|h zwYT7&l*le})M>GF z1fUqPU(WMjH#tPfiz3!>Zg{aSf4`8hUKfWVNvs&$+;KW26_UT|G^496Qe+k);@g=l zJqA|95Ah#cakWwB;8FW)qEs?a=-t+{b+j9aJr{*csLWLZ^;9fs9$2jZT3Vz}y89X2 z)V+%<5`Q_}3NY89qU6n)qB}E5>!ckG36svynJ-f?1r2J%sU0U@Rcf+Y-x)aUL7|~z zd%MWHxZMc!9Y3KnZL1(4Z613!u|CRGJ@=K1(P^&{+KYt9GI=6^nD)^7(BEAT>nMkv zp2LzG9gencesGIyd;g?IMJ{7gwtkV_k1dXY$T>p%PR=|vX^U)l_Co+&MFs8YTrhc# za!jmP+uSI=a+-0w)h=8R?KRHzRYy+-+pucst)3v-#Y@R@wa4eztbC71aem8++=o3S z|4w@gv0gSi)Ymq#J|b(Ul!V%#Jzwv=bo!M?EX}+Qc93Oqwiw@bs+)DG7Q-72eEMnq zKEvi<{-^aKabR}x1%aDMxu{%&#jZ=YR3QpIk*>yk?F-c+-@&WxL8?U)ymlcki#tZe z0Rb<&zWogS^|pyPZrEGLDDve3qy}zqCb+~)8(mE5p=1WGhxr&`CyZqV-06+)^t4YU!6<5<{iAkyqKVTXBpuDUneVX`i-1PV_vj+u~}d z>7J*>+54VwEiJ~+U0~py{;9SS-Lg)YW1DMn#9^HSDiGj64bFJ*tTQZNalH`0_?dKb;xwSIqqCGAxEdhhYlcDV4D zbBm@QDdD-Sy93W<*>znnR#q81Iux={dwD2gVp(kT`@XftI4z-?Q}UJjFMI~tstme3 zWVx8?pP_Uv{E3UY>M1M6%_zf*L#uH!=^pd#<4?P6EQsduaV&S|m1t{+C@pullE3^C zw1C%gq_rc2$3N#!4#3;l$CLIcKhsAcuPW6yqOXiN%*fbBgan14`XnnJ)ZPE#_QZ6f zzk--K)+!WhztQ;uVZ(*4h?N6QgTV@#rHl9yF_WHyHx3_ui@Eb?)}S+#v?$tWDd0(4 zoYU>4EpKJ&6z&sqSDK!hr#BU+P%@eGdxRxQj5IK;`ni-$6;Pv2!fXY9|3vgnbkg0j z9J*^ILaS$2Vk6v6&;n#BJtG2+W)#<+x)U0P^{ERgbDKRjJKI?2EB=B9aVIdm8>4f0 zF;3XR>zvu{tEN1e@ExfA70ME~ec>IUgB0;X2 zWR`X3eqAFY%75uDXj~z^&pE2vHQr`+0LVF5u#N_ z*K8AO{D^qfy69v3$AmjUnim&{+_7ZrajsbPuX}vTt@F?%C_re~TYY_huD@W=^y1hD z6TU^OjO}#lGLr4qDY<>g@7{b)iMgzgh8yc`t&H=6E-7&7lcgxvy-^m-dEdQ#*~_5T zp_PpN3E{)HdK5STkJand$$X{Gn31JO-AfZYXjt>ms16&On#5~Ro;ZycKGS!4IPa!h z14IE~a(E?ORr-9M6lc~GCW#uH|L1gaJ>yIuLY{Itfn+FXMh z^LmC!O(Xd<{mWe;^FBV-w(74z_BZd|l)scvbhF3`fD|N0Z!X`xet2PA?Z(^a%+vl+ z*hb=SgL;+`TBcqKvJWO$y3-p~X32Q)vNEG8glTkR*U&AeS9cbB)8{zo$ESch^yEpQ zT+Xe}X0mm+2-wG~?^g!{rB_$~!QDyXIX-<5dDT+Oe%N_@Ww+EL@~?0vuYk{|A3U4r z5EA3DR(HR%^!~;1vdHcgKYVYv<*r!Nq#hd#qRd+Y9wQRW+v94rE4Csnv`lT6cdu-A zUGdWw@y;Kb?rV2tX0h~-s(M7%a_eio&q?YKwD~>HJsTuzNG<3O+^Mytmagf(zGdKR z!cWmf&pLBq2&Z)L$DPHm$}a@)I;UR>cNj@^A8ttx8IYmF<;FwyHc@Jjvn}!4H#aOC$=_b+nr{BA zK09&m1SwARoB(U&Ot?K{s@1r)yxcRzV7sr^Rs!Bdb`OzZZh>JA4>#RwzayW5L3 zCc~LTF4QpWSjH#L_fGdMi#JUVOw+c$oAHdC(_Mum8V+ym46_eZR-S3B>3%h>B}h>& zOzn;tj8YC~=r;w+rWrlP7haOKWSNnm$hHmV?N7P8et$mUK3<9KzEMGAX3UD{Rcl5s zRfanb=11leo-hp8M1}B1gJ3B$O5oish9O8vPQkUufyIu!?*tP)jBcNFAH4cAchynB zu-9#w*Djgk2^uXbBf|exv0^jltj;&Wy!wD9mS+={6h9xC!x^qr{Xd+1H#U=D{>w4^Ot5e7rz@)J#OETZBz`YsR~Al}5B$oSM>KadtmobNa)- z@A*ma(LwjCvG>wuuA1ldI__uhztFoxxA8*7pOV$?8%x?TpFiaiW-#kHUJX+Cc~NUd zg=A=@BWe0BH14L~y5_UZkt_nqeo;vdToz7G6Kt%D|bMMK+b=vzHy!}3yx*_l-UJWJloho1a z6-9goHPEmr-el|Q(80~%MWBDDH-?6dwG+kac=Pd?>0w+j@jH-aBG)&IyC;#Gt~c8? ze0@V?_TgbG2Y=4?3Vr$jlwFuc^9H8<)k=of)3%pmss;+b^7}{q&giEvf3i_wc^C=y z98c9hYywKw*61BaP?RoRb!WRRLua3IV-1s+fw)RT&a1{?H-VaU`Az7xnOLFvPS>K( zEjsQeu%~TsfBgdk>AvpYBlm4EG*`R=(qh~+MsaWPZ*^B0L~H~oUuX1kztfE@#|E}4 zP5d=s=j6_xL5?ODW z@~87w5&{!s=%h^H6(^fB@RlzT zqfuLtK8S8ecRiqf5T^AB68N;s*0-;yDTkw|Hw!D{PcILOLSbZKJzm|LRdbL&s54d0 z-^+`uC6c-Jmb@2Bi|>qpF@uu}(*E%F?Z9-<3U^+VyOw^_drUkJ{%dd)yY@az+!ddY zH0u?xBScF{J5*t9=cMwUfQO7z{~?61z$$?6=z|v1IY3!(*!LTBJ&}&~2SXQM&=Ybn z{qm7nbcJ>OuO)0!?^V@TpSezNk)FO)xjhGctmJcv60R4NE-P&`xzmK@3rPs{-D%$- zx5NwV($latzLTR*dCze!LhQFCHqh#I|Nh@of*ZLdCeNsR&UG3b`S|=^DBwdSMK?~< zDe?W=&evu{rBtxjDy1^Ysp5lY;XG+nEruHYai6+S*Io%8i`&$1BR|8{jJz4+TG~t% z7k1o!HZ+vOjA$MYXQa(_)}f2Ir1f*q$Cp>xHAGv&Ja~UjCRXSl7YYNDMG`V+0SVoCPzZLKx18k)rp&tZ*Cbaq8Pp1PEKL!&}6lztZb*J3MD`Kby# zZIA`9!vfpyF&Mssy^G4Kyg?r$TSOe46~nzX;+{USzgKzrHhF)TQsp++fZ`bYit!!h zCHHb~VTcyYjic>MxOvLc0Q8ETTjLZbnlspNyP0#~xb4P|JNxD9Nz#|8cKs8_#qsC* z-M_-0vix2@(WG4?$_Gr+zP%(xE0JY05IpVcvq zS$S~$=*WF%uk?fcs)9&Fcb|{bPF~-atg|`agzz5vB1wldf|URmUs%OF{nroK9O{M! zYYX6J{;`ö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� z7hM=Gkxv_-9P#V&FU96OOF^rgg&&&01nfhEnwJ-VaMAk*&srjb-z88{KXm$0aYggn7EfuJIjP-!fvw8!4&PmPg z&Fk_9y|EWEcV%cU{RI09Uf0!%3}JnMkkRmXF!W2@Qf`HnJJi6K!H z>3)f8#Pl{unQ|^fI^LQ`M<%U8?(l5ud6j1-z@@$grV(J+?s@se4=>ag&ER!&(_o3G zE-BZmSy~g;rznIAIf&Y12Xt#d`1rl_pY^V3ptv1i#S>7pP<2^y)-s&Sqr7#*aj4WZWh-jV+;>${(>eU+!@|H=|NVI^xSjmD!pPfSgyFjod zyGNvKWEs}y6OgxQ9gU4kSlvuyQ8Bg|di7<)PEoLnSHz^u08R_;T{p=hpO^uYf z;+TY&b(Z#4K27q;(DyN3q+s!1rv#!Ssl92hkPKQQ&$V|Im+tZpzI2^_C9B({h z06dHIEYbdGw5q@YQXm@Ia-7OiZ!KLOWZUn@A-kq;d5ZJpLfbZt>~XLFN3%Dt4pjuyMp&OBSlXAtfs`v6l&0&pulGc-Q}0_9z^%xK#X≻n%-VPDOp zb;YeKuq_#sB)f?6n(3+pL>ac+Oo+SrWkS>=AQA3uhq_xn?wihm2=jn-3}LI6KkkZxdm5 z51{R39;Y5!Q2oZD$w7&Ah(O94DK{qvCZ}toih$3Ks3c+3WgVB0?y-jYvg0V`ubMh2 zRgKifa>GMY-umWliyETkcr*-A;R?*YW}N8lZ;50!qUy>>WL@2$`;O8meg zxGxz#8{|SCW(M~vW#wEIPo-S;-j$RFTs}&*(HIgevU^sQ3m;zl;i8==LkFJX*h)(Q$slu;9l>uyO zD?^*gg{z+u`6>%OFsODF{oe_;ZoZ4G(`BwcDkfgmPP}PFkzHAFv;;X)0FYf*^00)4 znZX&om|C1f4vd1)>*+eN12Fwe4FA?k_{U=saHC3M{qVk_e_^B4P%0Bz-6SAbv|D~( zfC>_Jo89;WP8q`Gl3taXiC3?0P6az$(Qm7YY#h*gyPisGW+i~N@XL;tk@QK%T~}Sd zGl-Dn_<{=#T}om#6QV&B+Je(s2f)M>SJUuy2K@0mWqU_Z^IP#dyC^IfM>H<|mJmVL zysz0Axe=$~=mrR2>Yj1Qr{R2rS+W#eu$%=~N_taVi)xWHw(=nkuWzKL5iV3r*4|^B z#eN?uelnET%0?` zUN>jJsiy3JJ?MuNcThjGx8{4G63R?*edLIINoE<*lRg@pcYx;}+EQveDL-dPqnW~3 zxeDc?wf=FrUotB{9^)ovh6WG#kFaH-;&;!t*T1=#AL>-O3jj(&$P`AN1kx^9g|-x; zRr|hQu5q`j-<)@QVK{j!^gz?hdFW@zif2H|4us_57N4@VQa1TIv>nAfKF3+r#AX%* z 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 II;Vst0Az!!fB*mh literal 0 HcmV?d00001 From 031062a923d9d37dec4eb2d49abe2e75c8e070ab Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 30 Oct 2025 16:22:57 -0400 Subject: [PATCH 3/9] Print a link to analysis section in README along with suite results --- runtime/commonMain/src/kotlinx/benchmark/BenchmarkProgress.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/commonMain/src/kotlinx/benchmark/BenchmarkProgress.kt b/runtime/commonMain/src/kotlinx/benchmark/BenchmarkProgress.kt index 7d543ca2..98d893b2 100644 --- a/runtime/commonMain/src/kotlinx/benchmark/BenchmarkProgress.kt +++ b/runtime/commonMain/src/kotlinx/benchmark/BenchmarkProgress.kt @@ -47,6 +47,7 @@ open class IntelliJBenchmarkProgress : BenchmarkProgress() { println(ijSuiteFinish(suite, currentClass, currentStatus)) } println(ijLogOutput(rootId, suite, "$suite summary:\n$summary\n")) + println(ijLogOutput(rootId, suite, "Analysing benchmark results is not always trivial, please refer to https://github.com/Kotlin/kotlinx-benchmark/tree/master?tab=readme-ov-file#analyzing-results for details.\n")) println(ijSuiteFinish(rootId, suite, suiteStatus)) println(ijSuiteFinish("", rootId, suiteStatus)) } From 196188c9ca6493044ed2bdd1de23aca6a57782ac Mon Sep 17 00:00:00 2001 From: Christian Melchior Date: Sun, 2 Nov 2025 20:15:46 +0100 Subject: [PATCH 4/9] Use custom schema for example notebooks to support different params --- examples/compare-benchmark-runs.ipynb | 1489 +++++++------- examples/simple-benchmark-analysis.ipynb | 2389 +++++++++++++--------- 2 files changed, 2182 insertions(+), 1696 deletions(-) diff --git a/examples/compare-benchmark-runs.ipynb b/examples/compare-benchmark-runs.ipynb index 832fbae3..25f0c10e 100644 --- a/examples/compare-benchmark-runs.ipynb +++ b/examples/compare-benchmark-runs.ipynb @@ -24,9 +24,12 @@ }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:38.121527Z", + "start_time": "2025-11-02T19:04:34.175593Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_2_jupyter", "Line_3_jupyter", "Line_4_jupyter", "Line_5_jupyter", @@ -39,29 +42,108 @@ "Line_12_jupyter", "Line_13_jupyter", "Line_14_jupyter", - "Line_15_jupyter" + "Line_15_jupyter", + "Line_16_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:24.159142Z", - "start_time": "2025-10-30T19:07:15.312266Z" } }, "cell_type": "code", "source": "%use serialization, dataframe, kandy", "outputs": [], - "execution_count": 22 + "execution_count": 1 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:38.654874Z", + "start_time": "2025-11-02T19:04:38.122183Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_16_jupyter" + "Line_17_jupyter" ] - }, + } + }, + "cell_type": "code", + "source": [ + "// Serialization classes matching the JMH JSON format.\n", + "// We define these classes manually so we can keep `params` as a JsonObject, as it means we can handle them\n", + "// in a generic manner. If you benchmark have fixed params, using `\"\".deserializeThis()` is\n", + "// faster and easier.\n", + "\n", + "@Serializable\n", + "public data class Benchmark(\n", + " public val jmhVersion: String,\n", + " public val benchmark: String,\n", + " public val mode: String,\n", + " public val threads: Int,\n", + " public val forks: Int,\n", + " public val jvm: String,\n", + " public val jvmArgs: List,\n", + " public val jdkVersion: String,\n", + " public val vmName: String,\n", + " public val vmVersion: String,\n", + " public val warmupIterations: Int,\n", + " public val warmupTime: String,\n", + " public val warmupBatchSize: Int,\n", + " public val measurementIterations: Int,\n", + " public val measurementTime: String,\n", + " public val measurementBatchSize: Int,\n", + " public val primaryMetric: PrimaryMetric,\n", + " public val secondaryMetrics: SecondaryMetrics,\n", + " public val params: JsonObject? = null\n", + ")\n", + "\n", + "@Serializable\n", + "public data class PrimaryMetric(\n", + " public val score: Double,\n", + " public val scoreError: Double,\n", + " public val scoreConfidence: List,\n", + " public val scorePercentiles: ScorePercentiles,\n", + " public val scoreUnit: String,\n", + " public val rawData: List>,\n", + ")\n", + "\n", + "@Serializable\n", + "public data class ScorePercentiles(\n", + " @SerialName(\"0.0\")\n", + " public val `value`: Double,\n", + " @SerialName(\"50.0\")\n", + " public val value1: Double,\n", + " @SerialName(\"90.0\")\n", + " public val value2: Double,\n", + " @SerialName(\"95.0\")\n", + " public val value3: Double,\n", + " @SerialName(\"99.0\")\n", + " public val value4: Double,\n", + " @SerialName(\"99.9\")\n", + " public val value5: Double,\n", + " @SerialName(\"99.99\")\n", + " public val value6: Double,\n", + " @SerialName(\"99.999\")\n", + " public val value7: Double,\n", + " @SerialName(\"99.9999\")\n", + " public val value8: Double,\n", + " @SerialName(\"100.0\")\n", + " public val value9: Double,\n", + ")\n", + "\n", + "@Serializable\n", + "public data object SecondaryMetrics" + ], + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { "ExecuteTime": { - "end_time": "2025-10-30T19:07:24.233302Z", - "start_time": "2025-10-30T19:07:24.163353Z" + "end_time": "2025-11-02T19:04:39.014912Z", + "start_time": "2025-11-02T19:04:38.656487Z" + }, + "executionRelatedData": { + "compiledClasses": [ + "Line_18_jupyter" + ] } }, "cell_type": "code", @@ -83,47 +165,44 @@ " .map { it.resolve(\"jvm.json\") }" ], "outputs": [], - "execution_count": 23 + "execution_count": 3 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:39.438641Z", + "start_time": "2025-11-02T19:04:39.015631Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_17_jupyter", - "Line_18_jupyter", - "Line_19_jupyter", - "Line_20_jupyter", - "Line_21_jupyter" + "Line_19_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:24.612683Z", - "start_time": "2025-10-30T19:07:24.236488Z" } }, "cell_type": "code", "source": [ - "// Convert to \"typed\" JSON\n", - "val newRun = outputFiles.first().readText().deserializeJson()\n", - "val oldRun = outputFiles.last().readText().deserializeJson()" + "// Convert to typed JSON\n", + "val json = Json { ignoreUnknownKeys = true }\n", + "val newRun = json.decodeFromString>(outputFiles.first().readText())\n", + "val oldRun = json.decodeFromString>(outputFiles.last().readText())" ], "outputs": [], - "execution_count": 24 + "execution_count": 4 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:40.061204Z", + "start_time": "2025-11-02T19:04:39.537335Z" + }, "executionRelatedData": { "compiledClasses": [ + "Line_20_jupyter", + "Line_21_jupyter", "Line_22_jupyter", "Line_23_jupyter", - "Line_24_jupyter", - "Line_25_jupyter", - "Line_26_jupyter" + "Line_24_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:25.009062Z", - "start_time": "2025-10-30T19:07:24.650840Z" } }, "cell_type": "code", @@ -136,20 +215,20 @@ "val newDf = newRun.toDataFrame().addId(\"rowIndex\")" ], "outputs": [], - "execution_count": 25 + "execution_count": 5 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:40.350100Z", + "start_time": "2025-11-02T19:04:40.062770Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_27_jupyter", - "Line_28_jupyter", - "Line_29_jupyter" + "Line_25_jupyter", + "Line_26_jupyter", + "Line_27_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:25.123632Z", - "start_time": "2025-10-30T19:07:25.016577Z" } }, "cell_type": "code", @@ -159,20 +238,20 @@ "// combinedData" ], "outputs": [], - "execution_count": 26 + "execution_count": 6 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:40.771522Z", + "start_time": "2025-11-02T19:04:40.350631Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_30_jupyter", - "Line_31_jupyter", - "Line_32_jupyter" + "Line_28_jupyter", + "Line_29_jupyter", + "Line_30_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:25.428102Z", - "start_time": "2025-10-30T19:07:25.128964Z" } }, "cell_type": "code", @@ -183,16 +262,9 @@ "val resultData = combinedData.mapToFrame {\n", " \"name\" from { it.benchmark }\n", " \"params\" from {\n", - " if (it.params != null) {\n", - " Json.decodeFromJsonElement>(Json.encodeToJsonElement(it.params))\n", - " .entries\n", - " .filter { it.value != null }\n", - " .sortedBy { it.key }\n", - " .map { \"${it.key}=${it.value}\" }\n", - " .joinToString(\",\")\n", - " } else {\n", - " \"\"\n", - " }\n", + " it.params?.entries.orEmpty()\n", + " .sortedBy { it.key }\n", + " .joinToString(\",\") { entry -> \"${entry.key}=${entry.value.jsonPrimitive.content}\" }\n", " }\n", " \"mode\" from { it.mode } // \"avgt\" or \"thrpt\"\n", " \"unit\" from { it.primaryMetric.scoreUnit }\n", @@ -209,20 +281,20 @@ "// resultData" ], "outputs": [], - "execution_count": 27 + "execution_count": 7 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:40.958315Z", + "start_time": "2025-11-02T19:04:40.773450Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_33_jupyter", - "Line_34_jupyter", - "Line_35_jupyter" + "Line_31_jupyter", + "Line_32_jupyter", + "Line_33_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:25.502050Z", - "start_time": "2025-10-30T19:07:25.433755Z" } }, "cell_type": "code", @@ -233,20 +305,20 @@ "// mergedData" ], "outputs": [], - "execution_count": 28 + "execution_count": 8 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:41.491636Z", + "start_time": "2025-11-02T19:04:40.985159Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_36_jupyter", - "Line_37_jupyter", - "Line_38_jupyter" + "Line_34_jupyter", + "Line_35_jupyter", + "Line_36_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:25.748428Z", - "start_time": "2025-10-30T19:07:25.516603Z" } }, "cell_type": "code", @@ -289,7 +361,7 @@ { "data": { "text/html": [ - " \n", " \n", " " ], - "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1053176.103331759,\"range\":\"1014444.6854321724..1091907.5212313458\",\"score1\":999715.5730582711,\"range1\":\"974954.2809652109..1024476.8651513313\",\"diffScore\":-53460.530273488024,\"diffScorePercentage\":-5.076124506088183,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4053714460364798E8,\"range\":\"1.3690787959174788E8..1.4416640961554807E8\",\"score1\":1.3251985400275281E8,\"range1\":\"1.2936737342079675E8..1.3567233458470887E8\",\"diffScore\":-8017290.600895166,\"diffScorePercentage\":-5.704748465970368,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208887.0803288155,\"range\":\"207898.89918554123..209875.26147208977\",\"score1\":196902.03613375648,\"range1\":\"191654.7423267418..202149.32994077116\",\"diffScore\":-11985.044195059018,\"diffScorePercentage\":-5.737570833099392,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208677.3206090656,\"range\":\"208062.74007314906..209291.9011449821\",\"score1\":198982.020454078,\"range1\":\"194497.3197739599..203466.72113419612\",\"diffScore\":-9695.300154987577,\"diffScorePercentage\":-4.646072762813873,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83625.73898681287,\"range\":\"83088.20039438509..84163.27757924065\",\"score1\":76487.5086281744,\"range1\":\"74595.04831374026..78379.96894260854\",\"diffScore\":-7138.230358638466,\"diffScorePercentage\":-8.535924997642304,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83718.3177697431,\"range\":\"83169.61975110027..84267.01578838592\",\"score1\":77218.5368951281,\"range1\":\"75599.16372724227..78837.91006301393\",\"diffScore\":-6499.780874614997,\"diffScorePercentage\":-7.763869422808808,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2540370.5762627637,\"range\":\"2288100.709941338..2792640.4425841896\",\"score1\":2312642.7736440543,\"range1\":\"2091779.438724716..2533506.1085633924\",\"diffScore\":-227727.8026187094,\"diffScorePercentage\":-8.964353655588646,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2566945.3411485883,\"range\":\"2360770.956540762..2773119.7257564147\",\"score1\":2295922.9388216315,\"range1\":\"2089935.2366487498..2501910.6409945134\",\"diffScore\":-271022.40232695686,\"diffScorePercentage\":-10.55816802884034,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2623681.4037052076,\"range\":\"2551535.491785763..2695827.3156246524\",\"score1\":2295223.3640071456,\"range1\":\"2115768.594299648..2474678.1337146433\",\"diffScore\":-328458.039698062,\"diffScorePercentage\":-12.51897578853164,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2540686.802958132,\"range\":\"2452532.053305992..2628841.5526102716\",\"score1\":2295128.5932107824,\"range1\":\"2082445.0002591067..2507812.186162458\",\"diffScore\":-245558.20974734938,\"diffScorePercentage\":-9.665032677835182,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147875.3323979754,\"range\":\"147061.31984741875..148689.34494853206\",\"score1\":139497.9818106305,\"range1\":\"135894.93943472698..143101.02418653402\",\"diffScore\":-8377.350587344903,\"diffScorePercentage\":-5.665144044984475,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148182.79464984537,\"range\":\"147312.38741453286..149053.20188515788\",\"score1\":139472.55121529553,\"range1\":\"135249.9703875965..143695.13204299458\",\"diffScore\":-8710.243434549833,\"diffScorePercentage\":-5.878039657122179,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148010.5612362782,\"range\":\"147183.62506193086..148837.49741062557\",\"score1\":137951.95168809665,\"range1\":\"133789.3696336104..142114.53374258292\",\"diffScore\":-10058.609548181557,\"diffScorePercentage\":-6.795872851346324,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147818.34957610376,\"range\":\"146603.6094475876..149033.08970461992\",\"score1\":135829.98563075942,\"range1\":\"131190.7048701939..140469.26639132493\",\"diffScore\":-11988.363945344347,\"diffScorePercentage\":-8.110200106903628,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":141910.35376521535,\"range\":\"141167.25628010757..142653.45125032312\",\"score1\":133932.19330461326,\"range1\":\"129878.2239827778..137986.16262644873\",\"diffScore\":-7978.160460602085,\"diffScorePercentage\":-5.621972075273389,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":9.316604268061413E-4,\"range\":\"9.238695011656973E-4..9.394513524465853E-4\",\"score1\":0.0010203532398568873,\"range1\":\"9.902780506238168E-4..0.0010504284290899577\",\"diffScore\":-8.8692813050746E-5,\"diffScorePercentage\":-9.519864802543674,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.4255527187620338E-5,\"range\":\"2.408636087672226E-5..2.4424693498518416E-5\",\"score1\":2.6287927694751805E-5,\"range1\":\"2.5596365181913836E-5..2.6979490207589775E-5\",\"diffScore\":-2.0324005071314676E-6,\"diffScorePercentage\":-8.379123205241132,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":7.074449573732205E-6,\"range\":\"7.049360189172837E-6..7.099538958291572E-6\",\"score1\":7.614962302484078E-6,\"range1\":\"7.456424871291536E-6..7.77349973367662E-6\",\"diffScore\":-5.405127287518736E-7,\"diffScorePercentage\":-7.640350293241543,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.659870901180189,\"range\":\"3.651226166681157..3.6685156356792206\",\"score1\":3.9713384641892873,\"range1\":\"3.8358525869703075..4.1068243414082675\",\"diffScore\":-0.3114675630090984,\"diffScorePercentage\":-8.510342889653847,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5616297575188567,\"range\":\"0.5582725986585425..0.5649869163791709\",\"score1\":0.6065983726836912,\"range1\":\"0.5901377228601924..0.62305902250719\",\"diffScore\":-0.044968615164834524,\"diffScorePercentage\":-8.00680778801588,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" + "application/kotlindataframe+json": "{\"$version\":\"2.2.0\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12,\"is_formatted\":false},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1124169.302037032,\"range\":\"1048963.3505892197..1199375.2534848445\",\"score1\":1104972.6706894366,\"range1\":\"1055663.3534587221..1154281.987920151\",\"diffScore\":-19196.63134759548,\"diffScorePercentage\":-1.7076281404242712,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4563056890183368E8,\"range\":\"1.4257469243792653E8..1.4868644536574084E8\",\"score1\":1.4634989745609665E8,\"range1\":\"1.437328117109918E8..1.489669832012015E8\",\"diffScore\":719328.5542629659,\"diffScorePercentage\":0.4939406332662542,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":215040.42648766268,\"range\":\"209159.44934415395..220921.40363117142\",\"score1\":213019.57841385395,\"range1\":\"204650.0532153221..221389.10361238578\",\"diffScore\":-2020.8480738087383,\"diffScorePercentage\":-0.9397526348026837,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":216167.94947592515,\"range\":\"209816.26197479176..222519.63697705854\",\"score1\":214917.7241256119,\"range1\":\"208616.32754332913..221219.12070789465\",\"diffScore\":-1250.225350313267,\"diffScorePercentage\":-0.5783583335754896,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":102937.09492915806,\"range\":\"102198.8667788953..103675.32307942082\",\"score1\":102424.75929129767,\"range1\":\"101113.46667154715..103736.05191104818\",\"diffScore\":-512.335637860393,\"diffScorePercentage\":-0.4977172108975735,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":103082.84485602807,\"range\":\"102746.60675391225..103419.08295814389\",\"score1\":101173.75249296638,\"range1\":\"99908.94648785368..102438.55849807907\",\"diffScore\":-1909.092363061689,\"diffScorePercentage\":-1.8519981338583025,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2672623.9977166834,\"range\":\"2581766.221460874..2763481.7739724927\",\"score1\":2680506.786160648,\"range1\":\"2646872.2297869264..2714141.3425343693\",\"diffScore\":7882.78844396444,\"diffScorePercentage\":0.2949456583005684,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2654913.2949247262,\"range\":\"2530927.3446583785..2778899.245191074\",\"score1\":2585022.6644677366,\"range1\":\"2454777.568459309..2715267.760476164\",\"diffScore\":-69890.63045698963,\"diffScorePercentage\":-2.6325014301068244,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2676852.389264137,\"range\":\"2585653.063020375..2768051.715507899\",\"score1\":2614856.4118722673,\"range1\":\"2580741.3402635106..2648971.483481024\",\"diffScore\":-61995.97739186976,\"diffScorePercentage\":-2.3160028412665805,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2676496.83515426,\"range\":\"2585056.261771287..2767937.4085372332\",\"score1\":2585237.244524414,\"range1\":\"2552358.4905912033..2618115.998457625\",\"diffScore\":-91259.59062984586,\"diffScorePercentage\":-3.409665553540104,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155929.81523562223,\"range\":\"155267.27942953032..156592.35104171414\",\"score1\":150449.20912261767,\"range1\":\"147414.465281937..153483.95296329833\",\"diffScore\":-5480.606113004556,\"diffScorePercentage\":-3.5147903591900813,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":156259.91933032282,\"range\":\"155967.2972273164..156552.54143332926\",\"score1\":147058.56562691744,\"range1\":\"140116.58313969668..154000.5481141382\",\"diffScore\":-9201.353703405388,\"diffScorePercentage\":-5.888492546802327,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155811.88330649625,\"range\":\"154012.99823010628..157610.76838288622\",\"score1\":146125.99724354869,\"range1\":\"143504.1570471993..148747.83743989808\",\"diffScore\":-9685.886062947568,\"diffScorePercentage\":-6.216397528482819,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":154835.23402865283,\"range\":\"152299.566575624..157370.90148168168\",\"score1\":150019.93211383233,\"range1\":\"145881.2852993276..154158.57892833705\",\"diffScore\":-4815.301914820506,\"diffScorePercentage\":-3.109952295437753,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":149758.67842734433,\"range\":\"149465.14095246932..150052.21590221935\",\"score1\":145509.90114707965,\"range1\":\"143242.89296995336..147776.90932420595\",\"diffScore\":-4248.77728026468,\"diffScorePercentage\":-2.8370825149381784,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":8.442082734074419E-4,\"range\":\"8.372522775198425E-4..8.511642692950413E-4\",\"score1\":8.972137714852465E-4,\"range1\":\"8.737790976669418E-4..9.206484453035511E-4\",\"diffScore\":-5.3005498077804544E-5,\"diffScorePercentage\":-6.278722887168673,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.1647588413775662E-5,\"range\":\"2.1394152325114E-5..2.1901024502437323E-5\",\"score1\":2.369188528309145E-5,\"range1\":\"2.3161777788037864E-5..2.4221992778145036E-5\",\"diffScore\":-2.044296869315788E-6,\"diffScorePercentage\":-9.443531677712787,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":6.6933720644037785E-6,\"range\":\"6.650531071713415E-6..6.736213057094142E-6\",\"score1\":6.7916806977233165E-6,\"range1\":\"6.710269330854009E-6..6.8730920645926235E-6\",\"diffScore\":-9.830863331953794E-8,\"diffScorePercentage\":-1.4687459829456666,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.472485344175375,\"range\":\"3.4596934638924464..3.485277224458304\",\"score1\":3.5445401759264423,\"range1\":\"3.5170213910539556..3.572058960798929\",\"diffScore\":-0.0720548317510672,\"diffScorePercentage\":-2.075021911091128,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5348082435809666,\"range\":\"0.5300538318352048..0.5395626553267283\",\"score1\":0.5428283650466172,\"range1\":\"0.5388189143575554..0.5468378157356791\",\"diffScore\":-0.008020121465650676,\"diffScorePercentage\":-1.4996256250557365,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" }, - "execution_count": 29, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 29 + "execution_count": 9 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:42.185621Z", + "start_time": "2025-11-02T19:04:41.621185Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_40_jupyter" + "Line_38_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:25.948197Z", - "start_time": "2025-10-30T19:07:25.777017Z" } }, "cell_type": "code", @@ -1021,23 +1093,47 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -12\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -10\n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -8\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -6\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -4\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBlackholeBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark\n", + " \n", + " \n", + " [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.cosBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " test.nested.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark\n", + " \n", + " \n", + " [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.sqrtBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark\n", + " \n", + " \n", + " [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.cosBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark\n", + " \n", + " \n", + " [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.baseBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.sqrtBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.inheritedBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark\n", + " \n", + " \n", + " [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark\n", + " \n", + " \n", + " [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.nested.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark\n", + " \n", + " \n", + " [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.baseBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark\n", + " \n", + " \n", + " [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.inheritedBenchmark\n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1592,12 +1721,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " Diff %\n", " \n", @@ -1605,10 +1731,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1616,48 +1742,48 @@ "mapping": {}, "data": { "testLabel": [ - "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", - "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", - "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", - "test.CommonBenchmark.longBenchmark", - "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", - "test.JvmTestBenchmark.cosBenchmark", "test.CommonBenchmark.longBlackholeBenchmark", - "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", - "test.JvmTestBenchmark.sqrtBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", - "test.CommonBenchmark.mathBenchmark", + "test.CommonBenchmark.longBenchmark", "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=2]", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", - "test.InheritedBenchmark.inheritedBenchmark", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", "test.nested.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.JvmTestBenchmark.cosBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", "test.InheritedBenchmark.baseBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]" + "test.JvmTestBenchmark.sqrtBenchmark", + "test.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", + "test.InheritedBenchmark.inheritedBenchmark" ], "diffScorePercentage": [ - -12.51897578853164, - -10.55816802884034, - -9.665032677835182, - -9.519864802543674, - -8.964353655588646, - -8.535924997642304, - -8.510342889653847, - -8.379123205241132, - -8.110200106903628, - -8.00680778801588, - -7.763869422808808, - -7.640350293241543, - -6.795872851346324, - -5.878039657122179, - -5.737570833099392, - -5.704748465970368, - -5.665144044984475, - -5.621972075273389, - -5.076124506088183, - -4.646072762813873 + -9.443531677712787, + -6.278722887168673, + -6.216397528482819, + -5.888492546802327, + -3.5147903591900813, + -3.409665553540104, + -3.109952295437753, + -2.8370825149381784, + -2.6325014301068244, + -2.3160028412665805, + -2.075021911091128, + -1.8519981338583025, + -1.7076281404242712, + -1.4996256250557365, + -1.4687459829456666, + -0.9397526348026837, + -0.5783583335754896, + -0.4977172108975735, + 0.2949456583005684, + 0.4939406332662542 ], "barColor": [ "neg", @@ -1678,8 +1804,8 @@ "neg", "neg", "neg", - "neg", - "neg" + "pos", + "pos" ] }, "ggsize": { @@ -1776,23 +1902,23 @@ "swing_enabled": true } }, - "execution_count": 30, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 30 + "execution_count": 10 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:42.305348Z", + "start_time": "2025-11-02T19:04:42.186913Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_41_jupyter" + "Line_39_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:26.110424Z", - "start_time": "2025-10-30T19:07:26.058517Z" } }, "cell_type": "code", @@ -1815,7 +1941,7 @@ { "data": { "text/html": [ - " \n", " \n", - "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.InheritedBenchmark.inheritedBenc...thrptops/s140537144.6036481.3690787959174788E8..1.4416640961554...132519854.0027531.2936737342079675E8..1.3567233458470...-8017290.600895-5.704748test.InheritedBenchmark.inheritedBenc...neg
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms208887.080329207898.89918554123..209875.26147208977196902.036134191654.7423267418..202149.32994077116-11985.044195-5.737571test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms208677.320609208062.74007314906..209291.9011449821198982.020454194497.3197739599..203466.72113419612-9695.300155-4.646073test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms83625.73898783088.20039438509..84163.2775792406576487.50862874595.04831374026..78379.96894260854-7138.230359-8.535925test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms83718.31777083169.61975110027..84267.0157883859277218.53689575599.16372724227..78837.91006301393-6499.780875-7.763869test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2623681.4037052551535.491785763..2695827.31562465242295223.3640072115768.594299648..2474678.1337146433-328458.039698-12.518976test.ParamBenchmark.otherBenchmark\n", - "[d...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms147875.332398147061.31984741875..148689.34494853206139497.981811135894.93943472698..143101.02418653402-8377.350587-5.665144test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms148182.794650147312.38741453286..149053.20188515788139472.551215135249.9703875965..143695.13204299458-8710.243435-5.878040test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms148010.561236147183.62506193086..148837.49741062557137951.951688133789.3696336104..142114.53374258292-10058.609548-6.795873test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms147818.349576146603.6094475876..149033.08970461992135829.985631131190.7048701939..140469.26639132493-11988.363945-8.110200test.ParamBenchmark.textContentCheck\n", - "...neg
test.nested.CommonBenchmark.mathBench...thrptops/ms141910.353765141167.25628010757..142653.45125032312133932.193305129878.2239827778..137986.16262644873-7978.160461-5.621972test.nested.CommonBenchmark.mathBench...neg
test.CommonBenchmark.longBenchmarkavgtms/op0.0009329.238695011656973E-4..9.3945135244658...0.0010209.902780506238168E-4..0.0010504284290...-0.000089-9.519865test.CommonBenchmark.longBenchmarkneg
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000242.408636087672226E-5..2.4424693498518...0.0000262.5596365181913836E-5..2.697949020758...-0.000002-8.379123test.CommonBenchmark.longBlackholeBen...neg
test.CommonBenchmark.mathBenchmarkavgtms/op0.0000077.049360189172837E-6..7.0995389582915...0.0000087.456424871291536E-6..7.7734997336766...-0.000001-7.640350test.CommonBenchmark.mathBenchmarkneg
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.6598713.651226166681157..3.66851563567922063.9713383.8358525869703075..4.1068243414082675-0.311468-8.510343test.JvmTestBenchmark.cosBenchmarkneg
test.JvmTestBenchmark.sqrtBenchmarkavgtns/op0.5616300.5582725986585425..0.56498691637917090.6065980.5901377228601924..0.62305902250719-0.044969-8.006808test.JvmTestBenchmark.sqrtBenchmarkneg
\n", + "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms103082.844856102746.60675391225..103419.08295814389101173.75249399908.94648785368..102438.55849807907-1909.092363-1.851998test.ParamBenchmark.mathBenchmark\n", + "[da...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms155929.815236155267.27942953032..156592.35104171414150449.209123147414.465281937..153483.95296329833-5480.606113-3.514790test.ParamBenchmark.textContentCheck\n", + "...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms156259.919330155967.2972273164..156552.54143332926147058.565627140116.58313969668..154000.5481141382-9201.353703-5.888493test.ParamBenchmark.textContentCheck\n", + "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms155811.883306154012.99823010628..157610.76838288622146125.997244143504.1570471993..148747.83743989808-9685.886063-6.216398test.ParamBenchmark.textContentCheck\n", + "...neg
test.nested.CommonBenchmark.mathBench...thrptops/ms149758.678427149465.14095246932..150052.21590221935145509.901147143242.89296995336..147776.90932420595-4248.777280-2.837083test.nested.CommonBenchmark.mathBench...neg
test.CommonBenchmark.longBenchmarkavgtms/op0.0008448.372522775198425E-4..8.5116426929504...0.0008978.737790976669418E-4..9.2064844530355...-0.000053-6.278723test.CommonBenchmark.longBenchmarkneg
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000222.1394152325114E-5..2.190102450243732...0.0000242.3161777788037864E-5..2.422199277814...-0.000002-9.443532test.CommonBenchmark.longBlackholeBen...neg
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.4724853.4596934638924464..3.4852772244583043.5445403.5170213910539556..3.572058960798929-0.072055-2.075022test.JvmTestBenchmark.cosBenchmarkneg
\n", " \n", " \n", " " ], - "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":16,\"ncol\":12},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4053714460364798E8,\"range\":\"1.3690787959174788E8..1.4416640961554807E8\",\"score1\":1.3251985400275281E8,\"range1\":\"1.2936737342079675E8..1.3567233458470887E8\",\"diffScore\":-8017290.600895166,\"diffScorePercentage\":-5.704748465970368,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208887.0803288155,\"range\":\"207898.89918554123..209875.26147208977\",\"score1\":196902.03613375648,\"range1\":\"191654.7423267418..202149.32994077116\",\"diffScore\":-11985.044195059018,\"diffScorePercentage\":-5.737570833099392,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":208677.3206090656,\"range\":\"208062.74007314906..209291.9011449821\",\"score1\":198982.020454078,\"range1\":\"194497.3197739599..203466.72113419612\",\"diffScore\":-9695.300154987577,\"diffScorePercentage\":-4.646072762813873,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83625.73898681287,\"range\":\"83088.20039438509..84163.27757924065\",\"score1\":76487.5086281744,\"range1\":\"74595.04831374026..78379.96894260854\",\"diffScore\":-7138.230358638466,\"diffScorePercentage\":-8.535924997642304,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":83718.3177697431,\"range\":\"83169.61975110027..84267.01578838592\",\"score1\":77218.5368951281,\"range1\":\"75599.16372724227..78837.91006301393\",\"diffScore\":-6499.780874614997,\"diffScorePercentage\":-7.763869422808808,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2623681.4037052076,\"range\":\"2551535.491785763..2695827.3156246524\",\"score1\":2295223.3640071456,\"range1\":\"2115768.594299648..2474678.1337146433\",\"diffScore\":-328458.039698062,\"diffScorePercentage\":-12.51897578853164,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147875.3323979754,\"range\":\"147061.31984741875..148689.34494853206\",\"score1\":139497.9818106305,\"range1\":\"135894.93943472698..143101.02418653402\",\"diffScore\":-8377.350587344903,\"diffScorePercentage\":-5.665144044984475,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148182.79464984537,\"range\":\"147312.38741453286..149053.20188515788\",\"score1\":139472.55121529553,\"range1\":\"135249.9703875965..143695.13204299458\",\"diffScore\":-8710.243434549833,\"diffScorePercentage\":-5.878039657122179,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":148010.5612362782,\"range\":\"147183.62506193086..148837.49741062557\",\"score1\":137951.95168809665,\"range1\":\"133789.3696336104..142114.53374258292\",\"diffScore\":-10058.609548181557,\"diffScorePercentage\":-6.795872851346324,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":147818.34957610376,\"range\":\"146603.6094475876..149033.08970461992\",\"score1\":135829.98563075942,\"range1\":\"131190.7048701939..140469.26639132493\",\"diffScore\":-11988.363945344347,\"diffScorePercentage\":-8.110200106903628,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":141910.35376521535,\"range\":\"141167.25628010757..142653.45125032312\",\"score1\":133932.19330461326,\"range1\":\"129878.2239827778..137986.16262644873\",\"diffScore\":-7978.160460602085,\"diffScorePercentage\":-5.621972075273389,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":9.316604268061413E-4,\"range\":\"9.238695011656973E-4..9.394513524465853E-4\",\"score1\":0.0010203532398568873,\"range1\":\"9.902780506238168E-4..0.0010504284290899577\",\"diffScore\":-8.8692813050746E-5,\"diffScorePercentage\":-9.519864802543674,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.4255527187620338E-5,\"range\":\"2.408636087672226E-5..2.4424693498518416E-5\",\"score1\":2.6287927694751805E-5,\"range1\":\"2.5596365181913836E-5..2.6979490207589775E-5\",\"diffScore\":-2.0324005071314676E-6,\"diffScorePercentage\":-8.379123205241132,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":7.074449573732205E-6,\"range\":\"7.049360189172837E-6..7.099538958291572E-6\",\"score1\":7.614962302484078E-6,\"range1\":\"7.456424871291536E-6..7.77349973367662E-6\",\"diffScore\":-5.405127287518736E-7,\"diffScorePercentage\":-7.640350293241543,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.659870901180189,\"range\":\"3.651226166681157..3.6685156356792206\",\"score1\":3.9713384641892873,\"range1\":\"3.8358525869703075..4.1068243414082675\",\"diffScore\":-0.3114675630090984,\"diffScorePercentage\":-8.510342889653847,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5616297575188567,\"range\":\"0.5582725986585425..0.5649869163791709\",\"score1\":0.6065983726836912,\"range1\":\"0.5901377228601924..0.62305902250719\",\"diffScore\":-0.044968615164834524,\"diffScorePercentage\":-8.00680778801588,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" + "application/kotlindataframe+json": "{\"$version\":\"2.2.0\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":8,\"ncol\":12,\"is_formatted\":false},\"kotlin_dataframe\":[{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":103082.84485602807,\"range\":\"102746.60675391225..103419.08295814389\",\"score1\":101173.75249296638,\"range1\":\"99908.94648785368..102438.55849807907\",\"diffScore\":-1909.092363061689,\"diffScorePercentage\":-1.8519981338583025,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155929.81523562223,\"range\":\"155267.27942953032..156592.35104171414\",\"score1\":150449.20912261767,\"range1\":\"147414.465281937..153483.95296329833\",\"diffScore\":-5480.606113004556,\"diffScorePercentage\":-3.5147903591900813,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":156259.91933032282,\"range\":\"155967.2972273164..156552.54143332926\",\"score1\":147058.56562691744,\"range1\":\"140116.58313969668..154000.5481141382\",\"diffScore\":-9201.353703405388,\"diffScorePercentage\":-5.888492546802327,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155811.88330649625,\"range\":\"154012.99823010628..157610.76838288622\",\"score1\":146125.99724354869,\"range1\":\"143504.1570471993..148747.83743989808\",\"diffScore\":-9685.886062947568,\"diffScorePercentage\":-6.216397528482819,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":149758.67842734433,\"range\":\"149465.14095246932..150052.21590221935\",\"score1\":145509.90114707965,\"range1\":\"143242.89296995336..147776.90932420595\",\"diffScore\":-4248.77728026468,\"diffScorePercentage\":-2.8370825149381784,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":8.442082734074419E-4,\"range\":\"8.372522775198425E-4..8.511642692950413E-4\",\"score1\":8.972137714852465E-4,\"range1\":\"8.737790976669418E-4..9.206484453035511E-4\",\"diffScore\":-5.3005498077804544E-5,\"diffScorePercentage\":-6.278722887168673,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.1647588413775662E-5,\"range\":\"2.1394152325114E-5..2.1901024502437323E-5\",\"score1\":2.369188528309145E-5,\"range1\":\"2.3161777788037864E-5..2.4221992778145036E-5\",\"diffScore\":-2.044296869315788E-6,\"diffScorePercentage\":-9.443531677712787,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.472485344175375,\"range\":\"3.4596934638924464..3.485277224458304\",\"score1\":3.5445401759264423,\"range1\":\"3.5170213910539556..3.572058960798929\",\"diffScore\":-0.0720548317510672,\"diffScorePercentage\":-2.075021911091128,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"}]}" }, - "execution_count": 31, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 31 + "execution_count": 11 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:04:42.619834Z", + "start_time": "2025-11-02T19:04:42.388164Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_43_jupyter" + "Line_41_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:07:26.456666Z", - "start_time": "2025-10-30T19:07:26.282635Z" } }, "cell_type": "code", @@ -2535,30 +2656,54 @@ { "data": { "text/html": [ - " \n", + "</html>\"> \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -12\n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -10\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " -8\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -6\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -4\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " -2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=1]\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBenchmark\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=1]\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.cosBenchmark\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " test.CommonBenchmark.longBlackholeBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.sqrtBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.inheritedBenchmark\n", + " \n", + " \n", + " \n", + " test.nested.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.cosBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.nested.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3065,23 +3131,20 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " Diff %\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3089,50 +3152,26 @@ "mapping": {}, "data": { "testLabel": [ - "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", - "test.CommonBenchmark.longBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", - "test.JvmTestBenchmark.cosBenchmark", "test.CommonBenchmark.longBlackholeBenchmark", - "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", - "test.JvmTestBenchmark.sqrtBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", - "test.CommonBenchmark.mathBenchmark", + "test.CommonBenchmark.longBenchmark", "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=2]", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", - "test.InheritedBenchmark.inheritedBenchmark", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=1]", "test.nested.CommonBenchmark.mathBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]" + "test.JvmTestBenchmark.cosBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]" ], "diffScorePercentage": [ - -12.51897578853164, - -9.519864802543674, - -8.535924997642304, - -8.510342889653847, - -8.379123205241132, - -8.110200106903628, - -8.00680778801588, - -7.763869422808808, - -7.640350293241543, - -6.795872851346324, - -5.878039657122179, - -5.737570833099392, - -5.704748465970368, - -5.665144044984475, - -5.621972075273389, - -4.646072762813873 + -9.443531677712787, + -6.278722887168673, + -6.216397528482819, + -5.888492546802327, + -3.5147903591900813, + -2.8370825149381784, + -2.075021911091128, + -1.8519981338583025 ], "barColor": [ - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", "neg", "neg", "neg", @@ -3145,7 +3184,7 @@ }, "ggsize": { "width": 800.0, - "height": 740.0 + "height": 420.0 }, "kind": "plot", "scales": [ @@ -3237,12 +3276,12 @@ "swing_enabled": true } }, - "execution_count": 32, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 32 + "execution_count": 12 } ], "metadata": { diff --git a/examples/simple-benchmark-analysis.ipynb b/examples/simple-benchmark-analysis.ipynb index ce26e613..1c2a8dff 100644 --- a/examples/simple-benchmark-analysis.ipynb +++ b/examples/simple-benchmark-analysis.ipynb @@ -22,9 +22,12 @@ }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:14:45.478863Z", + "start_time": "2025-11-02T19:14:42.525850Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_2_jupyter", "Line_3_jupyter", "Line_4_jupyter", "Line_5_jupyter", @@ -37,31 +40,108 @@ "Line_12_jupyter", "Line_13_jupyter", "Line_14_jupyter", - "Line_15_jupyter" + "Line_15_jupyter", + "Line_16_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:04:18.828503Z", - "start_time": "2025-10-30T19:04:09.489356Z" } }, "cell_type": "code", "source": "%use serialization, dataframe, kandy", "outputs": [], - "execution_count": 16 + "execution_count": 1 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:14:46.021638Z", + "start_time": "2025-11-02T19:14:45.493509Z" + }, "executionRelatedData": { "compiledClasses": [ - "Line_16_jupyter", - "Line_17_jupyter", - "Line_18_jupyter" + "Line_17_jupyter" ] - }, + } + }, + "cell_type": "code", + "source": [ + "// Serialization classes matching the JMH JSON format.\n", + "// We define these classes manually so we can keep `params` as a JsonObject, as it means we can handle them\n", + "// in a generic manner. If you benchmark have fixed params, using `\"\".deserializeThis()` is\n", + "// faster and easier.\n", + "\n", + "@Serializable\n", + "public data class Benchmark(\n", + " public val jmhVersion: String,\n", + " public val benchmark: String,\n", + " public val mode: String,\n", + " public val threads: Int,\n", + " public val forks: Int,\n", + " public val jvm: String,\n", + " public val jvmArgs: List,\n", + " public val jdkVersion: String,\n", + " public val vmName: String,\n", + " public val vmVersion: String,\n", + " public val warmupIterations: Int,\n", + " public val warmupTime: String,\n", + " public val warmupBatchSize: Int,\n", + " public val measurementIterations: Int,\n", + " public val measurementTime: String,\n", + " public val measurementBatchSize: Int,\n", + " public val primaryMetric: PrimaryMetric,\n", + " public val secondaryMetrics: SecondaryMetrics,\n", + " public val params: JsonObject? = null\n", + ")\n", + "\n", + "@Serializable\n", + "public data class PrimaryMetric(\n", + " public val score: Double,\n", + " public val scoreError: Double,\n", + " public val scoreConfidence: List,\n", + " public val scorePercentiles: ScorePercentiles,\n", + " public val scoreUnit: String,\n", + " public val rawData: List>,\n", + ")\n", + "\n", + "@Serializable\n", + "public data class ScorePercentiles(\n", + " @SerialName(\"0.0\")\n", + " public val `value`: Double,\n", + " @SerialName(\"50.0\")\n", + " public val value1: Double,\n", + " @SerialName(\"90.0\")\n", + " public val value2: Double,\n", + " @SerialName(\"95.0\")\n", + " public val value3: Double,\n", + " @SerialName(\"99.0\")\n", + " public val value4: Double,\n", + " @SerialName(\"99.9\")\n", + " public val value5: Double,\n", + " @SerialName(\"99.99\")\n", + " public val value6: Double,\n", + " @SerialName(\"99.999\")\n", + " public val value7: Double,\n", + " @SerialName(\"99.9999\")\n", + " public val value8: Double,\n", + " @SerialName(\"100.0\")\n", + " public val value9: Double,\n", + ")\n", + "\n", + "@Serializable\n", + "public data object SecondaryMetrics" + ], + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { "ExecuteTime": { - "end_time": "2025-10-30T19:04:19.102043Z", - "start_time": "2025-10-30T19:04:18.835428Z" + "end_time": "2025-11-02T19:14:46.537814Z", + "start_time": "2025-11-02T19:14:46.023791Z" + }, + "executionRelatedData": { + "compiledClasses": [ + "Line_18_jupyter" + ] } }, "cell_type": "code", @@ -81,21 +161,22 @@ " .sortedByDescending { dir -> Files.readAttributes(dir, BasicFileAttributes::class.java).creationTime() }\n", " .first()\n", "val outputFile = lastRunDir.resolve(\"jvm.json\")\n", - "val benchmarkData = outputFile.readText().deserializeJson()" + "val json = Json { ignoreUnknownKeys = true }\n", + "val benchmarkData = json.decodeFromString>(outputFile.readText())" ], "outputs": [], - "execution_count": 17 + "execution_count": 3 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:14:46.864102Z", + "start_time": "2025-11-02T19:14:46.539005Z" + }, "executionRelatedData": { "compiledClasses": [ "Line_19_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:04:19.230516Z", - "start_time": "2025-10-30T19:04:19.109700Z" } }, "cell_type": "code", @@ -118,19 +199,9 @@ " }\n", " .mapValues { group ->\n", " val benchmarks = group.value.map { benchmark ->\n", - " // Parameters are specific to each test. `deserializeJson()` will generate the appropriate data classes,\n", - " // but for generic handling of parameters we would need to fallback to reading the JSON. In this case\n", - " // we just handle them through the typed API.\n", - " val paramInfo = if (benchmark.params != null) {\n", - " val paramValues = Json.decodeFromJsonElement>(Json.encodeToJsonElement(benchmark.params))\n", - " paramValues.entries\n", - " .filter { it.value != null }\n", - " .sortedBy { it.key }\n", - " .map { \"${it.key}=${it.value}\" }\n", - " .joinToString(\",\")\n", - " } else {\n", - " \"\"\n", - " }\n", + " val paramInfo = benchmark.params?.entries.orEmpty()\n", + " .sortedBy { it.key }\n", + " .joinToString(\",\") { \"${it.key}=${it.value.jsonPrimitive.content}\" }\n", " val name = benchmark.benchmark\n", " Benchmark(\n", " name,\n", @@ -149,18 +220,18 @@ "// }" ], "outputs": [], - "execution_count": 18 + "execution_count": 4 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:14:47.320141Z", + "start_time": "2025-11-02T19:14:46.872111Z" + }, "executionRelatedData": { "compiledClasses": [ "Line_20_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:04:19.345867Z", - "start_time": "2025-10-30T19:04:19.239240Z" } }, "cell_type": "code", @@ -185,18 +256,18 @@ "}" ], "outputs": [], - "execution_count": 19 + "execution_count": 5 }, { "metadata": { + "ExecuteTime": { + "end_time": "2025-11-02T19:14:48.540608Z", + "start_time": "2025-11-02T19:14:47.405919Z" + }, "executionRelatedData": { "compiledClasses": [ "Line_21_jupyter" ] - }, - "ExecuteTime": { - "end_time": "2025-10-30T19:04:19.508653Z", - "start_time": "2025-10-30T19:04:19.350248Z" } }, "cell_type": "code", @@ -254,7 +325,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -262,17 +336,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 20M\n", + " \n", + " \n", + " \n", + " 2e+7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 40M\n", + " \n", + " \n", + " \n", + " 4e+7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 60M\n", + " \n", + " \n", + " \n", + " 6e+7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 80M\n", + " \n", + " \n", + " \n", + " 8e+7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 100M\n", + " \n", + " \n", + " \n", + " 1e+8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 120M\n", + " \n", + " \n", + " \n", + " 1.2e+8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 140M\n", + " \n", + " \n", + " \n", + " 1.4e+8\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " base\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " inherited\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -679,12 +796,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/s\n", " \n", @@ -692,10 +806,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -712,20 +826,20 @@ }, "data": { "score": [ - 999715.5730582711, - 1.3251985400275281E8 + 1104972.6706894366, + 1.4634989745609665E8 ], "errorMax": [ - 1024476.8651513313, - 1.3567233458470887E8 + 1154281.987920151, + 1.489669832012015E8 ], "label": [ "base", "inherited" ], "errorMin": [ - 974954.2809652109, - 1.2936737342079675E8 + 1055663.3534587221, + 1.437328117109918E8 ] }, "ggsize": { @@ -828,7 +942,10 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -837,7 +954,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -845,17 +965,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 50,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 150,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 200,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1 text=a "string" with quotes value=1\n", + " \n", + " \n", + " data=1\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1 text=a "string" with quotes value=2\n", + " \n", + " \n", + " data=1\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2 text=a "string" with quotes value=1\n", + " \n", + " \n", + " data=2\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2 text=a "string" with quotes value=2\n", + " \n", + " \n", + " data=2\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1277,12 +1464,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -1290,10 +1474,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1310,16 +1494,16 @@ }, "data": { "score": [ - 196902.03613375648, - 198982.020454078, - 76487.5086281744, - 77218.5368951281 + 213019.57841385395, + 214917.7241256119, + 102424.75929129767, + 101173.75249296638 ], "errorMax": [ - 202149.32994077116, - 203466.72113419612, - 78379.96894260854, - 78837.91006301393 + 221389.10361238578, + 221219.12070789465, + 103736.05191104818, + 102438.55849807907 ], "label": [ "data=1\ntext=a \"string\" with quotes\nvalue=1", @@ -1328,10 +1512,10 @@ "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 191654.7423267418, - 194497.3197739599, - 74595.04831374026, - 75599.16372724227 + 204650.0532153221, + 208616.32754332913, + 101113.46667154715, + 99908.94648785368 ] }, "ggsize": { @@ -1434,7 +1618,10 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -1443,7 +1630,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -1451,17 +1641,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 500,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1,000,000\n", + " \n", + " \n", + " \n", + " 1e+6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1,500,000\n", + " \n", + " \n", + " \n", + " 1.5e+6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2,000,000\n", + " \n", + " \n", + " \n", + " 2e+6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2,500,000\n", + " \n", + " \n", + " \n", + " 2.5e+6\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1 text=a "string" with quotes value=1\n", + " \n", + " \n", + " data=1\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1 text=a "string" with quotes value=2\n", + " \n", + " \n", + " data=1\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2 text=a "string" with quotes value=1\n", + " \n", + " \n", + " data=2\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2 text=a "string" with quotes value=2\n", + " \n", + " \n", + " data=2\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1892,12 +2149,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -1905,10 +2159,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1925,16 +2179,16 @@ }, "data": { "score": [ - 2312642.7736440543, - 2295922.9388216315, - 2295223.3640071456, - 2295128.5932107824 + 2680506.786160648, + 2585022.6644677366, + 2614856.4118722673, + 2585237.244524414 ], "errorMax": [ - 2533506.1085633924, - 2501910.6409945134, - 2474678.1337146433, - 2507812.186162458 + 2714141.3425343693, + 2715267.760476164, + 2648971.483481024, + 2618115.998457625 ], "label": [ "data=1\ntext=a \"string\" with quotes\nvalue=1", @@ -1943,10 +2197,10 @@ "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 2091779.438724716, - 2089935.2366487498, - 2115768.594299648, - 2082445.0002591067 + 2646872.2297869264, + 2454777.568459309, + 2580741.3402635106, + 2552358.4905912033 ] }, "ggsize": { @@ -2049,7 +2303,10 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -2058,7 +2315,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -2066,17 +2326,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 20,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 40,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 60,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 80,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 120,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 140,000\n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " 160,000\n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1 text=a "string" with quotes value=1\n", + " \n", + " \n", + " data=1\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1 text=a "string" with quotes value=2\n", + " \n", + " \n", + " data=1\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2 text=a "string" with quotes value=1\n", + " \n", + " \n", + " data=2\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2 text=a "string" with quotes value=2\n", + " \n", + " \n", + " data=2\n", + " \n", + " \n", + " text=a "string" with quotes\n", + " \n", + " \n", + " value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2525,12 +2861,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -2538,10 +2871,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -2558,16 +2891,16 @@ }, "data": { "score": [ - 139497.9818106305, - 139472.55121529553, - 137951.95168809665, - 135829.98563075942 + 150449.20912261767, + 147058.56562691744, + 146125.99724354869, + 150019.93211383233 ], "errorMax": [ - 143101.02418653402, - 143695.13204299458, - 142114.53374258292, - 140469.26639132493 + 153483.95296329833, + 154000.5481141382, + 148747.83743989808, + 154158.57892833705 ], "label": [ "data=1\ntext=a \"string\" with quotes\nvalue=1", @@ -2576,10 +2909,10 @@ "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 135894.93943472698, - 135249.9703875965, - 133789.3696336104, - 131190.7048701939 + 147414.465281937, + 140116.58313969668, + 143504.1570471993, + 145881.2852993276 ] }, "ggsize": { @@ -2682,7 +3015,10 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -2691,7 +3027,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -2699,17 +3038,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 20,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 40,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 60,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 80,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 120,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 140,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " math\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3095,12 +3477,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -3108,10 +3487,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3128,16 +3507,16 @@ }, "data": { "score": [ - 133932.19330461326 + 145509.90114707965 ], "errorMax": [ - 137986.16262644873 + 147776.90932420595 ], "label": [ "math" ], "errorMin": [ - 129878.2239827778 + 143242.89296995336 ] }, "ggsize": { @@ -3240,7 +3619,10 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -3249,7 +3631,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -3257,17 +3642,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " 0.0000\n", + " \n", + " \n", + " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0001\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0002\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0003\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0004\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0005\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0006\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0007\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0008\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0009\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 0.0010\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 0.0011\n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " long\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " longBlackhole\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " math\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3731,12 +4141,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ms/op\n", " \n", @@ -3744,10 +4151,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3764,14 +4171,14 @@ }, "data": { "score": [ - 0.0010203532398568873, - 2.6287927694751805E-5, - 7.614962302484078E-6 + 8.972137714852465E-4, + 2.369188528309145E-5, + 6.7916806977233165E-6 ], "errorMax": [ - 0.0010504284290899577, - 2.6979490207589775E-5, - 7.77349973367662E-6 + 9.206484453035511E-4, + 2.4221992778145036E-5, + 6.8730920645926235E-6 ], "label": [ "long", @@ -3779,9 +4186,9 @@ "math" ], "errorMin": [ - 9.902780506238168E-4, - 2.5596365181913836E-5, - 7.456424871291536E-6 + 8.737790976669418E-4, + 2.3161777788037864E-5, + 6.710269330854009E-6 ] }, "ggsize": { @@ -3884,7 +4291,10 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -3893,7 +4303,10 @@ ] }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } }, { "data": { @@ -3901,17 +4314,41 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " 0.0\n", + " \n", + " \n", + " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.0\n", + " \n", + " \n", + " \n", + " 1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2.0\n", + " \n", + " \n", + " \n", + " 2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 2.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 3.0\n", + " \n", + " \n", + " \n", + " 3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 3.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 4.0\n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " cos\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " sqrt\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4327,12 +4774,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " ns/op\n", " \n", @@ -4340,10 +4784,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -4360,20 +4804,20 @@ }, "data": { "score": [ - 3.9713384641892873, - 0.6065983726836912 + 3.5445401759264423, + 0.5428283650466172 ], "errorMax": [ - 4.1068243414082675, - 0.62305902250719 + 3.572058960798929, + 0.5468378157356791 ], "label": [ "cos", "sqrt" ], "errorMin": [ - 3.8358525869703075, - 0.5901377228601924 + 3.5170213910539556, + 0.5388189143575554 ] }, "ggsize": { @@ -4476,10 +4920,13 @@ } }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } } ], - "execution_count": 20 + "execution_count": 6 } ], "metadata": { From c9cc07c9ad7527c0d26c168c098fc2ada0641fcb Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Wed, 12 Nov 2025 18:02:25 -0500 Subject: [PATCH 5/9] Simplify Benchmark DTO Left only properties supported by both JMH and kx-benchmark --- examples/compare-benchmark-runs.ipynb | 1421 +++++++------ examples/simple-benchmark-analysis.ipynb | 2312 +++++++++------------- 2 files changed, 1655 insertions(+), 2078 deletions(-) diff --git a/examples/compare-benchmark-runs.ipynb b/examples/compare-benchmark-runs.ipynb index 25f0c10e..470488ae 100644 --- a/examples/compare-benchmark-runs.ipynb +++ b/examples/compare-benchmark-runs.ipynb @@ -24,10 +24,6 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:38.121527Z", - "start_time": "2025-11-02T19:04:34.175593Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_3_jupyter", @@ -45,6 +41,10 @@ "Line_15_jupyter", "Line_16_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:09.608819Z", + "start_time": "2025-11-12T23:01:04.678470Z" } }, "cell_type": "code", @@ -54,43 +54,33 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:38.654874Z", - "start_time": "2025-11-02T19:04:38.122183Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_17_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:10.065548Z", + "start_time": "2025-11-12T23:01:09.615279Z" } }, "cell_type": "code", "source": [ - "// Serialization classes matching the JMH JSON format.\n", + "// Serialization classes matching the JMH-alike JSON format.\n", "// We define these classes manually so we can keep `params` as a JsonObject, as it means we can handle them\n", "// in a generic manner. If you benchmark have fixed params, using `\"\".deserializeThis()` is\n", "// faster and easier.\n", "\n", "@Serializable\n", "public data class Benchmark(\n", - " public val jmhVersion: String,\n", " public val benchmark: String,\n", " public val mode: String,\n", - " public val threads: Int,\n", - " public val forks: Int,\n", - " public val jvm: String,\n", - " public val jvmArgs: List,\n", - " public val jdkVersion: String,\n", - " public val vmName: String,\n", - " public val vmVersion: String,\n", " public val warmupIterations: Int,\n", " public val warmupTime: String,\n", - " public val warmupBatchSize: Int,\n", " public val measurementIterations: Int,\n", " public val measurementTime: String,\n", - " public val measurementBatchSize: Int,\n", " public val primaryMetric: PrimaryMetric,\n", - " public val secondaryMetrics: SecondaryMetrics,\n", + " public val secondaryMetrics: Map,\n", " public val params: JsonObject? = null\n", ")\n", "\n", @@ -99,51 +89,24 @@ " public val score: Double,\n", " public val scoreError: Double,\n", " public val scoreConfidence: List,\n", - " public val scorePercentiles: ScorePercentiles,\n", + " public val scorePercentiles: Map,\n", " public val scoreUnit: String,\n", " public val rawData: List>,\n", - ")\n", - "\n", - "@Serializable\n", - "public data class ScorePercentiles(\n", - " @SerialName(\"0.0\")\n", - " public val `value`: Double,\n", - " @SerialName(\"50.0\")\n", - " public val value1: Double,\n", - " @SerialName(\"90.0\")\n", - " public val value2: Double,\n", - " @SerialName(\"95.0\")\n", - " public val value3: Double,\n", - " @SerialName(\"99.0\")\n", - " public val value4: Double,\n", - " @SerialName(\"99.9\")\n", - " public val value5: Double,\n", - " @SerialName(\"99.99\")\n", - " public val value6: Double,\n", - " @SerialName(\"99.999\")\n", - " public val value7: Double,\n", - " @SerialName(\"99.9999\")\n", - " public val value8: Double,\n", - " @SerialName(\"100.0\")\n", - " public val value9: Double,\n", - ")\n", - "\n", - "@Serializable\n", - "public data object SecondaryMetrics" + ")" ], "outputs": [], "execution_count": 2 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:39.014912Z", - "start_time": "2025-11-02T19:04:38.656487Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_18_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:10.621667Z", + "start_time": "2025-11-12T23:01:10.097804Z" } }, "cell_type": "code", @@ -169,14 +132,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:39.438641Z", - "start_time": "2025-11-02T19:04:39.015631Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_19_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:10.770928Z", + "start_time": "2025-11-12T23:01:10.626280Z" } }, "cell_type": "code", @@ -191,10 +154,6 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:40.061204Z", - "start_time": "2025-11-02T19:04:39.537335Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_20_jupyter", @@ -203,6 +162,10 @@ "Line_23_jupyter", "Line_24_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:11.249299Z", + "start_time": "2025-11-12T23:01:10.775339Z" } }, "cell_type": "code", @@ -219,16 +182,16 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:40.350100Z", - "start_time": "2025-11-02T19:04:40.062770Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_25_jupyter", "Line_26_jupyter", "Line_27_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:11.560635Z", + "start_time": "2025-11-12T23:01:11.256258Z" } }, "cell_type": "code", @@ -242,16 +205,16 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:40.771522Z", - "start_time": "2025-11-02T19:04:40.350631Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_28_jupyter", "Line_29_jupyter", "Line_30_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:11.982028Z", + "start_time": "2025-11-12T23:01:11.565945Z" } }, "cell_type": "code", @@ -285,16 +248,16 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:40.958315Z", - "start_time": "2025-11-02T19:04:40.773450Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_31_jupyter", "Line_32_jupyter", "Line_33_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:12.181560Z", + "start_time": "2025-11-12T23:01:11.996744Z" } }, "cell_type": "code", @@ -309,16 +272,16 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:41.491636Z", - "start_time": "2025-11-02T19:04:40.985159Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_34_jupyter", "Line_35_jupyter", "Line_36_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:12.492447Z", + "start_time": "2025-11-12T23:01:12.187988Z" } }, "cell_type": "code", @@ -540,7 +503,7 @@ " </style>\n", " </head>\n", " <body>\n", - " <table class="dataframe" id="df_-1157627904"></table>\n", + " <table class="dataframe" id="df_-268435456"></table>\n", "\n", "<p class="dataframe_description">DataFrame: rowsCount = 20, columnsCount = 12</p>\n", "\n", @@ -825,18 +788,18 @@ "{ name: "<span title=\"params: String\">params</span>", children: [], rightAlign: false, values: ["","","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","","","","","",""] }, \n", "{ name: "<span title=\"mode: String\">mode</span>", children: [], rightAlign: false, values: ["thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","avgt","avgt","avgt","avgt","avgt"] }, \n", "{ name: "<span title=\"unit: String\">unit</span>", children: [], rightAlign: false, values: ["ops/s","ops/s","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ms/op","ms/op","ms/op","ns/op","ns/op"] }, \n", - "{ name: "<span title=\"score: Double\">score</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">1124169.302037</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">145630568.901834</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">215040.426488</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">216167.949476</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">102937.094929</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">103082.844856</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2672623.997717</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2654913.294925</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2676852.389264</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2676496.835154</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">155929.815236</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">156259.919330</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">155811.883306</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">154835.234029</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">149758.678427</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000844</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000022</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000007</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.472485</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.534808</span></span>"] }, \n", - "{ name: "<span title=\"range: ranges.ClosedFloatingPointRange<Double>\">range</span>", children: [], rightAlign: false, values: ["1048963.3505892197..1199375.2534848445","<span class=\"formatted\" title=\"1.4257469243792653E8..1.4868644536574084E8\">1.4257469243792653E8..1.4868644536574<span class=\"structural\">...</span></span>","209159.44934415395..220921.40363117142","209816.26197479176..222519.63697705854","102198.8667788953..103675.32307942082","102746.60675391225..103419.08295814389","2581766.221460874..2763481.7739724927","2530927.3446583785..2778899.245191074","2585653.063020375..2768051.715507899","2585056.261771287..2767937.4085372332","155267.27942953032..156592.35104171414","155967.2972273164..156552.54143332926","154012.99823010628..157610.76838288622","152299.566575624..157370.90148168168","149465.14095246932..150052.21590221935","<span class=\"formatted\" title=\"8.372522775198425E-4..8.511642692950413E-4\">8.372522775198425E-4..8.5116426929504<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.1394152325114E-5..2.1901024502437323E-5\">2.1394152325114E-5..2.190102450243732<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"6.650531071713415E-6..6.736213057094142E-6\">6.650531071713415E-6..6.7362130570941<span class=\"structural\">...</span></span>","3.4596934638924464..3.485277224458304","0.5300538318352048..0.5395626553267283"] }, \n", - "{ name: "<span title=\"score1: Double\">score1</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">1104972.670689</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">146349897.456097</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">213019.578414</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">214917.724126</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">102424.759291</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">101173.752493</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2680506.786161</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2585022.664468</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2614856.411872</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2585237.244524</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">150449.209123</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">147058.565627</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">146125.997244</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">150019.932114</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">145509.901147</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000897</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000024</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000007</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.544540</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.542828</span></span>"] }, \n", - "{ name: "<span title=\"range1: ranges.ClosedFloatingPointRange<Double>\">range1</span>", children: [], rightAlign: false, values: ["1055663.3534587221..1154281.987920151","1.437328117109918E8..1.489669832012015E8","204650.0532153221..221389.10361238578","208616.32754332913..221219.12070789465","101113.46667154715..103736.05191104818","99908.94648785368..102438.55849807907","2646872.2297869264..2714141.3425343693","2454777.568459309..2715267.760476164","2580741.3402635106..2648971.483481024","2552358.4905912033..2618115.998457625","147414.465281937..153483.95296329833","140116.58313969668..154000.5481141382","143504.1570471993..148747.83743989808","145881.2852993276..154158.57892833705","143242.89296995336..147776.90932420595","<span class=\"formatted\" title=\"8.737790976669418E-4..9.206484453035511E-4\">8.737790976669418E-4..9.2064844530355<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.3161777788037864E-5..2.4221992778145036E-5\">2.3161777788037864E-5..2.422199277814<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"6.710269330854009E-6..6.8730920645926235E-6\">6.710269330854009E-6..6.8730920645926<span class=\"structural\">...</span></span>","3.5170213910539556..3.572058960798929","0.5388189143575554..0.5468378157356791"] }, \n", - "{ name: "<span title=\"diffScore: Double\">diffScore</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">-19196.631348</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">719328.554263</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2020.848074</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1250.225350</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-512.335638</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1909.092363</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">7882.788444</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-69890.630457</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-61995.977392</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-91259.590630</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-5480.606113</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-9201.353703</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-9685.886063</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-4815.301915</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-4248.777280</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.000053</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.000002</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.000000</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.072055</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.008020</span></span>"] }, \n", - "{ name: "<span title=\"diffScorePercentage: Double\">diffScorePercentage</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1.707628</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.493941</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.939753</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.578358</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.497717</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1.851998</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.294946</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2.632501</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2.316003</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-3.409666</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-3.514790</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-5.888493</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-6.216398</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-3.109952</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2.837083</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-6.278723</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-9.443532</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1.468746</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2.075022</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1.499626</span></span>"] }, \n", + "{ name: "<span title=\"score: Double\">score</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">999715.573058</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">132519854.002753</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">196902.036134</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">198982.020454</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">76487.508628</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">77218.536895</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2312642.773644</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2295922.938822</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2295223.364007</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2295128.593211</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">139497.981811</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">139472.551215</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">137951.951688</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">135829.985631</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">133932.193305</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.001020</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000026</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000008</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.971338</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.606598</span></span>"] }, \n", + "{ name: "<span title=\"range: ranges.ClosedFloatingPointRange<Double>\">range</span>", children: [], rightAlign: false, values: ["974954.2809652109..1024476.8651513313","<span class=\"formatted\" title=\"1.2936737342079675E8..1.3567233458470887E8\">1.2936737342079675E8..1.3567233458470<span class=\"structural\">...</span></span>","191654.7423267418..202149.32994077116","194497.3197739599..203466.72113419612","74595.04831374026..78379.96894260854","75599.16372724227..78837.91006301393","2091779.438724716..2533506.1085633924","2089935.2366487498..2501910.6409945134","2115768.594299648..2474678.1337146433","2082445.0002591067..2507812.186162458","135894.93943472698..143101.02418653402","135249.9703875965..143695.13204299458","133789.3696336104..142114.53374258292","131190.7048701939..140469.26639132493","129878.2239827778..137986.16262644873","<span class=\"formatted\" title=\"9.902780506238168E-4..0.0010504284290899577\">9.902780506238168E-4..0.0010504284290<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.5596365181913836E-5..2.6979490207589775E-5\">2.5596365181913836E-5..2.697949020758<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"7.456424871291536E-6..7.77349973367662E-6\">7.456424871291536E-6..7.7734997336766<span class=\"structural\">...</span></span>","3.8358525869703075..4.1068243414082675","0.5901377228601924..0.62305902250719"] }, \n", + "{ name: "<span title=\"score1: Double\">score1</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">1140852.957229</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">146792560.895807</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">217133.491804</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">216593.775142</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">86523.588517</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">85944.381961</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2616589.198790</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2629054.441671</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2646402.737052</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2652047.742142</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">154381.766970</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">153578.254496</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">153262.850584</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">153672.584595</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">148921.638469</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000854</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000023</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000007</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.495849</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.541162</span></span>"] }, \n", + "{ name: "<span title=\"range1: ranges.ClosedFloatingPointRange<Double>\">range1</span>", children: [], rightAlign: false, values: ["1106659.7386652725..1175046.1757937148","<span class=\"formatted\" title=\"1.4482756334251586E8..1.4875755844909838E8\">1.4482756334251586E8..1.4875755844909<span class=\"structural\">...</span></span>","215027.16316066374..219239.82044761901","212594.8732753121..220592.677009433","82315.21514352418..90731.96188974172","81177.07416021802..90711.68976101496","2579570.7359826625..2653607.6615965427","2524752.102688715..2733356.780654085","2616649.4130033795..2676156.0611009924","2627344.681389795..2676750.802894536","153348.64196544446..155414.89197494255","150716.46891485332..156440.04007752796","150745.58896373163..155780.11220499463","150946.56541126606..156398.60377851175","148674.35770053475..149168.91923706495","<span class=\"formatted\" title=\"8.428241181867443E-4..8.649269988130904E-4\">8.428241181867443E-4..8.6492699881309<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.284205842928573E-5..2.3608924259914014E-5\">2.284205842928573E-5..2.3608924259914<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"6.685553120802533E-6..6.873011588250474E-6\">6.685553120802533E-6..6.8730115882504<span class=\"structural\">...</span></span>","3.48368627561432..3.5080116159522237","0.5348433328074729..0.5474798680717454"] }, \n", + "{ name: "<span title=\"diffScore: Double\">diffScore</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">141137.384171</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14272706.893054</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">20231.455670</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">17611.754688</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10036.079888</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">8725.845065</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">303946.425146</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">333131.502850</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">351179.373045</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">356919.148931</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14883.785160</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14105.703281</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">15310.898896</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">17842.598964</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14989.445164</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000166</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000003</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000001</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.475490</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.065437</span></span>"] }, \n", + "{ name: "<span title=\"diffScorePercentage: Double\">diffScorePercentage</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">14.117754</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.770240</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.274884</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">8.850928</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">13.121201</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.300195</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">13.142818</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14.509699</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">15.300444</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">15.551161</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.669534</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.113605</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.098719</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">13.135979</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.191816</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">16.315691</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.649592</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.974184</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.973029</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.787496</span></span>"] }, \n", "{ name: "<span title=\"testLabel: String\">testLabel</span>", children: [], rightAlign: false, values: ["test.InheritedBenchmark.baseBenchmark","<span class=\"formatted\" title=\"test.InheritedBenchmark.inheritedBenchmark\">test.InheritedBenchmark.inheritedBenc<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.nested.CommonBenchmark.mathBenchmark\">test.nested.CommonBenchmark.mathBench<span class=\"structural\">...</span></span>","test.CommonBenchmark.longBenchmark","<span class=\"formatted\" title=\"test.CommonBenchmark.longBlackholeBenchmark\">test.CommonBenchmark.longBlackholeBen<span class=\"structural\">...</span></span>","test.CommonBenchmark.mathBenchmark","test.JvmTestBenchmark.cosBenchmark","test.JvmTestBenchmark.sqrtBenchmark"] }, \n", - "{ name: "<span title=\"barColor: String\">barColor</span>", children: [], rightAlign: false, values: ["neg","pos","neg","neg","neg","neg","pos","neg","neg","neg","neg","neg","neg","neg","neg","neg","neg","neg","neg","neg"] }, \n", - "], id: -1157627904, rootId: -1157627904, totalRows: 20 } ) });\n", + "{ name: "<span title=\"barColor: String\">barColor</span>", children: [], rightAlign: false, values: ["pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos"] }, \n", + "], id: -268435456, rootId: -268435456, totalRows: 20 } ) });\n", "/*-->*/\n", "\n", - "call_DataFrame(function() { DataFrame.renderTable(-1157627904) });\n", + "call_DataFrame(function() { DataFrame.renderTable(-268435456) });\n", "\n", "\n", " </script>\n", @@ -1009,26 +972,26 @@ " \n", " \n", " \n", - "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.InheritedBenchmark.baseBenchmarkthrptops/s1124169.3020371048963.3505892197..1199375.25348484451104972.6706891055663.3534587221..1154281.987920151-19196.631348-1.707628test.InheritedBenchmark.baseBenchmarkneg
test.InheritedBenchmark.inheritedBenc...thrptops/s145630568.9018341.4257469243792653E8..1.4868644536574...146349897.4560971.437328117109918E8..1.489669832012015E8719328.5542630.493941test.InheritedBenchmark.inheritedBenc...pos
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms215040.426488209159.44934415395..220921.40363117142213019.578414204650.0532153221..221389.10361238578-2020.848074-0.939753test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms216167.949476209816.26197479176..222519.63697705854214917.724126208616.32754332913..221219.12070789465-1250.225350-0.578358test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms102937.094929102198.8667788953..103675.32307942082102424.759291101113.46667154715..103736.05191104818-512.335638-0.497717test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms103082.844856102746.60675391225..103419.08295814389101173.75249399908.94648785368..102438.55849807907-1909.092363-1.851998test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.otherBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms2672623.9977172581766.221460874..2763481.77397249272680506.7861612646872.2297869264..2714141.34253436937882.7884440.294946test.ParamBenchmark.otherBenchmark\n", - "[d...pos
test.ParamBenchmark.otherBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms2654913.2949252530927.3446583785..2778899.2451910742585022.6644682454777.568459309..2715267.760476164-69890.630457-2.632501test.ParamBenchmark.otherBenchmark\n", - "[d...neg
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2676852.3892642585653.063020375..2768051.7155078992614856.4118722580741.3402635106..2648971.483481024-61995.977392-2.316003test.ParamBenchmark.otherBenchmark\n", - "[d...neg
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2676496.8351542585056.261771287..2767937.40853723322585237.2445242552358.4905912033..2618115.998457625-91259.590630-3.409666test.ParamBenchmark.otherBenchmark\n", - "[d...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms155929.815236155267.27942953032..156592.35104171414150449.209123147414.465281937..153483.95296329833-5480.606113-3.514790test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms156259.919330155967.2972273164..156552.54143332926147058.565627140116.58313969668..154000.5481141382-9201.353703-5.888493test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms155811.883306154012.99823010628..157610.76838288622146125.997244143504.1570471993..148747.83743989808-9685.886063-6.216398test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms154835.234029152299.566575624..157370.90148168168150019.932114145881.2852993276..154158.57892833705-4815.301915-3.109952test.ParamBenchmark.textContentCheck\n", - "...neg
test.nested.CommonBenchmark.mathBench...thrptops/ms149758.678427149465.14095246932..150052.21590221935145509.901147143242.89296995336..147776.90932420595-4248.777280-2.837083test.nested.CommonBenchmark.mathBench...neg
test.CommonBenchmark.longBenchmarkavgtms/op0.0008448.372522775198425E-4..8.5116426929504...0.0008978.737790976669418E-4..9.2064844530355...-0.000053-6.278723test.CommonBenchmark.longBenchmarkneg
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000222.1394152325114E-5..2.190102450243732...0.0000242.3161777788037864E-5..2.422199277814...-0.000002-9.443532test.CommonBenchmark.longBlackholeBen...neg
test.CommonBenchmark.mathBenchmarkavgtms/op0.0000076.650531071713415E-6..6.7362130570941...0.0000076.710269330854009E-6..6.8730920645926...-0.000000-1.468746test.CommonBenchmark.mathBenchmarkneg
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.4724853.4596934638924464..3.4852772244583043.5445403.5170213910539556..3.572058960798929-0.072055-2.075022test.JvmTestBenchmark.cosBenchmarkneg
test.JvmTestBenchmark.sqrtBenchmarkavgtns/op0.5348080.5300538318352048..0.53956265532672830.5428280.5388189143575554..0.5468378157356791-0.008020-1.499626test.JvmTestBenchmark.sqrtBenchmarkneg
\n", + "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.InheritedBenchmark.baseBenchmarkthrptops/s999715.573058974954.2809652109..1024476.86515133131140852.9572291106659.7386652725..1175046.1757937148141137.38417114.117754test.InheritedBenchmark.baseBenchmarkpos
test.InheritedBenchmark.inheritedBenc...thrptops/s132519854.0027531.2936737342079675E8..1.3567233458470...146792560.8958071.4482756334251586E8..1.4875755844909...14272706.89305410.770240test.InheritedBenchmark.inheritedBenc...pos
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms196902.036134191654.7423267418..202149.32994077116217133.491804215027.16316066374..219239.8204476190120231.45567010.274884test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms198982.020454194497.3197739599..203466.72113419612216593.775142212594.8732753121..220592.67700943317611.7546888.850928test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms76487.50862874595.04831374026..78379.9689426085486523.58851782315.21514352418..90731.9618897417210036.07988813.121201test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms77218.53689575599.16372724227..78837.9100630139385944.38196181177.07416021802..90711.689761014968725.84506511.300195test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.otherBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms2312642.7736442091779.438724716..2533506.10856339242616589.1987902579570.7359826625..2653607.6615965427303946.42514613.142818test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.otherBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms2295922.9388222089935.2366487498..2501910.64099451342629054.4416712524752.102688715..2733356.780654085333131.50285014.509699test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2295223.3640072115768.594299648..2474678.13371464332646402.7370522616649.4130033795..2676156.0611009924351179.37304515.300444test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2295128.5932112082445.0002591067..2507812.1861624582652047.7421422627344.681389795..2676750.802894536356919.14893115.551161test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms139497.981811135894.93943472698..143101.02418653402154381.766970153348.64196544446..155414.8919749425514883.78516010.669534test.ParamBenchmark.textContentCheck\n", + "...pos
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms139472.551215135249.9703875965..143695.13204299458153578.254496150716.46891485332..156440.0400775279614105.70328110.113605test.ParamBenchmark.textContentCheck\n", + "...pos
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms137951.951688133789.3696336104..142114.53374258292153262.850584150745.58896373163..155780.1122049946315310.89889611.098719test.ParamBenchmark.textContentCheck\n", + "...pos
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms135829.985631131190.7048701939..140469.26639132493153672.584595150946.56541126606..156398.6037785117517842.59896413.135979test.ParamBenchmark.textContentCheck\n", + "...pos
test.nested.CommonBenchmark.mathBench...thrptops/ms133932.193305129878.2239827778..137986.16262644873148921.638469148674.35770053475..149168.9192370649514989.44516411.191816test.nested.CommonBenchmark.mathBench...pos
test.CommonBenchmark.longBenchmarkavgtms/op0.0010209.902780506238168E-4..0.0010504284290...0.0008548.428241181867443E-4..8.6492699881309...0.00016616.315691test.CommonBenchmark.longBenchmarkpos
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000262.5596365181913836E-5..2.697949020758...0.0000232.284205842928573E-5..2.3608924259914...0.00000311.649592test.CommonBenchmark.longBlackholeBen...pos
test.CommonBenchmark.mathBenchmarkavgtms/op0.0000087.456424871291536E-6..7.7734997336766...0.0000076.685553120802533E-6..6.8730115882504...0.00000110.974184test.CommonBenchmark.mathBenchmarkpos
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.9713383.8358525869703075..4.10682434140826753.4958493.48368627561432..3.50801161595222370.47549011.973029test.JvmTestBenchmark.cosBenchmarkpos
test.JvmTestBenchmark.sqrtBenchmarkavgtns/op0.6065980.5901377228601924..0.623059022507190.5411620.5348433328074729..0.54747986807174540.06543710.787496test.JvmTestBenchmark.sqrtBenchmarkpos
\n", " \n", " \n", " " ], - "application/kotlindataframe+json": "{\"$version\":\"2.2.0\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12,\"is_formatted\":false},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1124169.302037032,\"range\":\"1048963.3505892197..1199375.2534848445\",\"score1\":1104972.6706894366,\"range1\":\"1055663.3534587221..1154281.987920151\",\"diffScore\":-19196.63134759548,\"diffScorePercentage\":-1.7076281404242712,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.4563056890183368E8,\"range\":\"1.4257469243792653E8..1.4868644536574084E8\",\"score1\":1.4634989745609665E8,\"range1\":\"1.437328117109918E8..1.489669832012015E8\",\"diffScore\":719328.5542629659,\"diffScorePercentage\":0.4939406332662542,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":215040.42648766268,\"range\":\"209159.44934415395..220921.40363117142\",\"score1\":213019.57841385395,\"range1\":\"204650.0532153221..221389.10361238578\",\"diffScore\":-2020.8480738087383,\"diffScorePercentage\":-0.9397526348026837,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":216167.94947592515,\"range\":\"209816.26197479176..222519.63697705854\",\"score1\":214917.7241256119,\"range1\":\"208616.32754332913..221219.12070789465\",\"diffScore\":-1250.225350313267,\"diffScorePercentage\":-0.5783583335754896,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":102937.09492915806,\"range\":\"102198.8667788953..103675.32307942082\",\"score1\":102424.75929129767,\"range1\":\"101113.46667154715..103736.05191104818\",\"diffScore\":-512.335637860393,\"diffScorePercentage\":-0.4977172108975735,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":103082.84485602807,\"range\":\"102746.60675391225..103419.08295814389\",\"score1\":101173.75249296638,\"range1\":\"99908.94648785368..102438.55849807907\",\"diffScore\":-1909.092363061689,\"diffScorePercentage\":-1.8519981338583025,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2672623.9977166834,\"range\":\"2581766.221460874..2763481.7739724927\",\"score1\":2680506.786160648,\"range1\":\"2646872.2297869264..2714141.3425343693\",\"diffScore\":7882.78844396444,\"diffScorePercentage\":0.2949456583005684,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2654913.2949247262,\"range\":\"2530927.3446583785..2778899.245191074\",\"score1\":2585022.6644677366,\"range1\":\"2454777.568459309..2715267.760476164\",\"diffScore\":-69890.63045698963,\"diffScorePercentage\":-2.6325014301068244,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2676852.389264137,\"range\":\"2585653.063020375..2768051.715507899\",\"score1\":2614856.4118722673,\"range1\":\"2580741.3402635106..2648971.483481024\",\"diffScore\":-61995.97739186976,\"diffScorePercentage\":-2.3160028412665805,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2676496.83515426,\"range\":\"2585056.261771287..2767937.4085372332\",\"score1\":2585237.244524414,\"range1\":\"2552358.4905912033..2618115.998457625\",\"diffScore\":-91259.59062984586,\"diffScorePercentage\":-3.409665553540104,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155929.81523562223,\"range\":\"155267.27942953032..156592.35104171414\",\"score1\":150449.20912261767,\"range1\":\"147414.465281937..153483.95296329833\",\"diffScore\":-5480.606113004556,\"diffScorePercentage\":-3.5147903591900813,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":156259.91933032282,\"range\":\"155967.2972273164..156552.54143332926\",\"score1\":147058.56562691744,\"range1\":\"140116.58313969668..154000.5481141382\",\"diffScore\":-9201.353703405388,\"diffScorePercentage\":-5.888492546802327,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155811.88330649625,\"range\":\"154012.99823010628..157610.76838288622\",\"score1\":146125.99724354869,\"range1\":\"143504.1570471993..148747.83743989808\",\"diffScore\":-9685.886062947568,\"diffScorePercentage\":-6.216397528482819,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":154835.23402865283,\"range\":\"152299.566575624..157370.90148168168\",\"score1\":150019.93211383233,\"range1\":\"145881.2852993276..154158.57892833705\",\"diffScore\":-4815.301914820506,\"diffScorePercentage\":-3.109952295437753,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":149758.67842734433,\"range\":\"149465.14095246932..150052.21590221935\",\"score1\":145509.90114707965,\"range1\":\"143242.89296995336..147776.90932420595\",\"diffScore\":-4248.77728026468,\"diffScorePercentage\":-2.8370825149381784,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":8.442082734074419E-4,\"range\":\"8.372522775198425E-4..8.511642692950413E-4\",\"score1\":8.972137714852465E-4,\"range1\":\"8.737790976669418E-4..9.206484453035511E-4\",\"diffScore\":-5.3005498077804544E-5,\"diffScorePercentage\":-6.278722887168673,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.1647588413775662E-5,\"range\":\"2.1394152325114E-5..2.1901024502437323E-5\",\"score1\":2.369188528309145E-5,\"range1\":\"2.3161777788037864E-5..2.4221992778145036E-5\",\"diffScore\":-2.044296869315788E-6,\"diffScorePercentage\":-9.443531677712787,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":6.6933720644037785E-6,\"range\":\"6.650531071713415E-6..6.736213057094142E-6\",\"score1\":6.7916806977233165E-6,\"range1\":\"6.710269330854009E-6..6.8730920645926235E-6\",\"diffScore\":-9.830863331953794E-8,\"diffScorePercentage\":-1.4687459829456666,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.472485344175375,\"range\":\"3.4596934638924464..3.485277224458304\",\"score1\":3.5445401759264423,\"range1\":\"3.5170213910539556..3.572058960798929\",\"diffScore\":-0.0720548317510672,\"diffScorePercentage\":-2.075021911091128,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.5348082435809666,\"range\":\"0.5300538318352048..0.5395626553267283\",\"score1\":0.5428283650466172,\"range1\":\"0.5388189143575554..0.5468378157356791\",\"diffScore\":-0.008020121465650676,\"diffScorePercentage\":-1.4996256250557365,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"neg\"}]}" + "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":999715.5730582711,\"range\":\"974954.2809652109..1024476.8651513313\",\"score1\":1140852.9572294937,\"range1\":\"1106659.7386652725..1175046.1757937148\",\"diffScore\":141137.38417122257,\"diffScorePercentage\":14.117753886684326,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.3251985400275281E8,\"range\":\"1.2936737342079675E8..1.3567233458470887E8\",\"score1\":1.4679256089580712E8,\"range1\":\"1.4482756334251586E8..1.4875755844909838E8\",\"diffScore\":1.4272706893054307E7,\"diffScorePercentage\":10.770240429602211,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":196902.03613375648,\"range\":\"191654.7423267418..202149.32994077116\",\"score1\":217133.49180414138,\"range1\":\"215027.16316066374..219239.82044761901\",\"diffScore\":20231.455670384894,\"diffScorePercentage\":10.274883930931813,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":198982.020454078,\"range\":\"194497.3197739599..203466.72113419612\",\"score1\":216593.77514237256,\"range1\":\"212594.8732753121..220592.677009433\",\"diffScore\":17611.754688294546,\"diffScorePercentage\":8.85092766075268,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":76487.5086281744,\"range\":\"74595.04831374026..78379.96894260854\",\"score1\":86523.58851663295,\"range1\":\"82315.21514352418..90731.96188974172\",\"diffScore\":10036.079888458553,\"diffScorePercentage\":13.121201184949738,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":77218.5368951281,\"range\":\"75599.16372724227..78837.91006301393\",\"score1\":85944.38196061649,\"range1\":\"81177.07416021802..90711.68976101496\",\"diffScore\":8725.845065488393,\"diffScorePercentage\":11.300194767143958,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2312642.7736440543,\"range\":\"2091779.438724716..2533506.1085633924\",\"score1\":2616589.1987896026,\"range1\":\"2579570.7359826625..2653607.6615965427\",\"diffScore\":303946.4251455483,\"diffScorePercentage\":13.142817758516887,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2295922.9388216315,\"range\":\"2089935.2366487498..2501910.6409945134\",\"score1\":2629054.4416714,\"range1\":\"2524752.102688715..2733356.780654085\",\"diffScore\":333131.5028497684,\"diffScorePercentage\":14.509698788964847,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2295223.3640071456,\"range\":\"2115768.594299648..2474678.1337146433\",\"score1\":2646402.737052186,\"range1\":\"2616649.4130033795..2676156.0611009924\",\"diffScore\":351179.3730450403,\"diffScorePercentage\":15.300444329388892,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2295128.5932107824,\"range\":\"2082445.0002591067..2507812.186162458\",\"score1\":2652047.7421421655,\"range1\":\"2627344.681389795..2676750.802894536\",\"diffScore\":356919.14893138316,\"diffScorePercentage\":15.551161272060545,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":139497.9818106305,\"range\":\"135894.93943472698..143101.02418653402\",\"score1\":154381.7669701935,\"range1\":\"153348.64196544446..155414.89197494255\",\"diffScore\":14883.785159563005,\"diffScorePercentage\":10.669534402130527,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":139472.55121529553,\"range\":\"135249.9703875965..143695.13204299458\",\"score1\":153578.25449619064,\"range1\":\"150716.46891485332..156440.04007752796\",\"diffScore\":14105.703280895104,\"diffScorePercentage\":10.113605263533874,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":137951.95168809665,\"range\":\"133789.3696336104..142114.53374258292\",\"score1\":153262.85058436313,\"range1\":\"150745.58896373163..155780.11220499463\",\"diffScore\":15310.898896266473,\"diffScorePercentage\":11.098718582020316,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":135829.98563075942,\"range\":\"131190.7048701939..140469.26639132493\",\"score1\":153672.5845948889,\"range1\":\"150946.56541126606..156398.60377851175\",\"diffScore\":17842.598964129487,\"diffScorePercentage\":13.13597942403738,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":133932.19330461326,\"range\":\"129878.2239827778..137986.16262644873\",\"score1\":148921.63846879985,\"range1\":\"148674.35770053475..149168.91923706495\",\"diffScore\":14989.445164186589,\"diffScorePercentage\":11.191816391817635,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":0.0010203532398568873,\"range\":\"9.902780506238168E-4..0.0010504284290899577\",\"score1\":8.538755584999174E-4,\"range1\":\"8.428241181867443E-4..8.649269988130904E-4\",\"diffScore\":1.6647768135696992E-4,\"diffScorePercentage\":16.31569096407434,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.6287927694751805E-5,\"range\":\"2.5596365181913836E-5..2.6979490207589775E-5\",\"score1\":2.3225491344599873E-5,\"range1\":\"2.284205842928573E-5..2.3608924259914014E-5\",\"diffScore\":3.0624363501519328E-6,\"diffScorePercentage\":11.649592108256316,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":7.614962302484078E-6,\"range\":\"7.456424871291536E-6..7.77349973367662E-6\",\"score1\":6.779282354526504E-6,\"range1\":\"6.685553120802533E-6..6.873011588250474E-6\",\"diffScore\":8.356799479575747E-7,\"diffScorePercentage\":10.974183650061766,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.9713384641892873,\"range\":\"3.8358525869703075..4.1068243414082675\",\"score1\":3.4958489457832718,\"range1\":\"3.48368627561432..3.5080116159522237\",\"diffScore\":0.4754895184060155,\"diffScorePercentage\":11.973029312249324,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.6065983726836912,\"range\":\"0.5901377228601924..0.62305902250719\",\"score1\":0.5411616004396091,\"range1\":\"0.5348433328074729..0.5474798680717454\",\"diffScore\":0.06543677224408206,\"diffScorePercentage\":10.787495514466844,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"pos\"}]}" }, "execution_count": 9, "metadata": {}, @@ -1039,14 +1002,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:42.185621Z", - "start_time": "2025-11-02T19:04:41.621185Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_38_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:13.096488Z", + "start_time": "2025-11-12T23:01:12.552457Z" } }, "cell_type": "code", @@ -1093,47 +1056,23 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -8\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -6\n", + " \n", + " \n", + " 0\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -4\n", + " \n", + " \n", + " 5\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -2\n", + " \n", + " \n", + " 10\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " 0\n", + " \n", + " \n", + " 15\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.inheritedBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.sqrtBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", - " \n", - " \n", - " [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.nested.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.nested.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.cosBenchmark\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBlackholeBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.cosBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.baseBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.JvmTestBenchmark.sqrtBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.baseBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", - " \n", - " \n", - " [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.otherBenchmark\n", - " \n", - " \n", - " [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.InheritedBenchmark.inheritedBenchmark\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBenchmark\n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1721,9 +1594,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " Diff %\n", " \n", @@ -1731,10 +1607,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1742,68 +1618,68 @@ "mapping": {}, "data": { "testLabel": [ - "test.CommonBenchmark.longBlackholeBenchmark", - "test.CommonBenchmark.longBenchmark", - "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=1]", - "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", - "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", - "test.nested.CommonBenchmark.mathBenchmark", - "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", - "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", - "test.JvmTestBenchmark.cosBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", - "test.InheritedBenchmark.baseBenchmark", + "test.InheritedBenchmark.inheritedBenchmark", "test.JvmTestBenchmark.sqrtBenchmark", "test.CommonBenchmark.mathBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", - "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", + "test.nested.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", + "test.CommonBenchmark.longBlackholeBenchmark", + "test.JvmTestBenchmark.cosBenchmark", "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", - "test.InheritedBenchmark.inheritedBenchmark" + "test.InheritedBenchmark.baseBenchmark", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", + "test.CommonBenchmark.longBenchmark" ], "diffScorePercentage": [ - -9.443531677712787, - -6.278722887168673, - -6.216397528482819, - -5.888492546802327, - -3.5147903591900813, - -3.409665553540104, - -3.109952295437753, - -2.8370825149381784, - -2.6325014301068244, - -2.3160028412665805, - -2.075021911091128, - -1.8519981338583025, - -1.7076281404242712, - -1.4996256250557365, - -1.4687459829456666, - -0.9397526348026837, - -0.5783583335754896, - -0.4977172108975735, - 0.2949456583005684, - 0.4939406332662542 + 8.85092766075268, + 10.113605263533874, + 10.274883930931813, + 10.669534402130527, + 10.770240429602211, + 10.787495514466844, + 10.974183650061766, + 11.098718582020316, + 11.191816391817635, + 11.300194767143958, + 11.649592108256316, + 11.973029312249324, + 13.121201184949738, + 13.13597942403738, + 13.142817758516887, + 14.117753886684326, + 14.509698788964847, + 15.300444329388892, + 15.551161272060545, + 16.31569096407434 ], "barColor": [ - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", "pos", "pos" ] @@ -1911,14 +1787,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:42.305348Z", - "start_time": "2025-11-02T19:04:42.186913Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_39_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:13.354938Z", + "start_time": "2025-11-12T23:01:13.243696Z" } }, "cell_type": "code", @@ -2120,9 +1996,9 @@ " </style>\n", " </head>\n", " <body>\n", - " <table class="dataframe" id="df_-1157627900"></table>\n", + " <table class="dataframe" id="df_-268435452"></table>\n", "\n", - "<p class="dataframe_description">DataFrame: rowsCount = 8, columnsCount = 12</p>\n", + "<p class="dataframe_description">DataFrame: rowsCount = 20, columnsCount = 12</p>\n", "\n", " </body>\n", " <script>\n", @@ -2401,22 +2277,22 @@ "})()\n", "\n", "/*<!--*/\n", - "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"name: String\">name</span>", children: [], rightAlign: false, values: ["test.ParamBenchmark.mathBenchmark","test.ParamBenchmark.textContentCheck","test.ParamBenchmark.textContentCheck","test.ParamBenchmark.textContentCheck","<span class=\"formatted\" title=\"test.nested.CommonBenchmark.mathBenchmark\">test.nested.CommonBenchmark.mathBench<span class=\"structural\">...</span></span>","test.CommonBenchmark.longBenchmark","<span class=\"formatted\" title=\"test.CommonBenchmark.longBlackholeBenchmark\">test.CommonBenchmark.longBlackholeBen<span class=\"structural\">...</span></span>","test.JvmTestBenchmark.cosBenchmark"] }, \n", - "{ name: "<span title=\"params: String\">params</span>", children: [], rightAlign: false, values: ["<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","","","",""] }, \n", - "{ name: "<span title=\"mode: String\">mode</span>", children: [], rightAlign: false, values: ["thrpt","thrpt","thrpt","thrpt","thrpt","avgt","avgt","avgt"] }, \n", - "{ name: "<span title=\"unit: String\">unit</span>", children: [], rightAlign: false, values: ["ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ms/op","ms/op","ns/op"] }, \n", - "{ name: "<span title=\"score: Double\">score</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">103082.844856</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">155929.815236</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">156259.919330</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">155811.883306</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">149758.678427</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000844</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000022</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.472485</span></span>"] }, \n", - "{ name: "<span title=\"range: ranges.ClosedFloatingPointRange<Double>\">range</span>", children: [], rightAlign: false, values: ["102746.60675391225..103419.08295814389","155267.27942953032..156592.35104171414","155967.2972273164..156552.54143332926","154012.99823010628..157610.76838288622","149465.14095246932..150052.21590221935","<span class=\"formatted\" title=\"8.372522775198425E-4..8.511642692950413E-4\">8.372522775198425E-4..8.5116426929504<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.1394152325114E-5..2.1901024502437323E-5\">2.1394152325114E-5..2.190102450243732<span class=\"structural\">...</span></span>","3.4596934638924464..3.485277224458304"] }, \n", - "{ name: "<span title=\"score1: Double\">score1</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">101173.752493</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">150449.209123</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">147058.565627</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">146125.997244</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">145509.901147</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000897</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000024</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.544540</span></span>"] }, \n", - "{ name: "<span title=\"range1: ranges.ClosedFloatingPointRange<Double>\">range1</span>", children: [], rightAlign: false, values: ["99908.94648785368..102438.55849807907","147414.465281937..153483.95296329833","140116.58313969668..154000.5481141382","143504.1570471993..148747.83743989808","143242.89296995336..147776.90932420595","<span class=\"formatted\" title=\"8.737790976669418E-4..9.206484453035511E-4\">8.737790976669418E-4..9.2064844530355<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.3161777788037864E-5..2.4221992778145036E-5\">2.3161777788037864E-5..2.422199277814<span class=\"structural\">...</span></span>","3.5170213910539556..3.572058960798929"] }, \n", - "{ name: "<span title=\"diffScore: Double\">diffScore</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1909.092363</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-5480.606113</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-9201.353703</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-9685.886063</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-4248.777280</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.000053</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.000002</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-0.072055</span></span>"] }, \n", - "{ name: "<span title=\"diffScorePercentage: Double\">diffScorePercentage</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">-1.851998</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-3.514790</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-5.888493</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-6.216398</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2.837083</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-6.278723</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-9.443532</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">-2.075022</span></span>"] }, \n", - "{ name: "<span title=\"testLabel: String\">testLabel</span>", children: [], rightAlign: false, values: ["<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.nested.CommonBenchmark.mathBenchmark\">test.nested.CommonBenchmark.mathBench<span class=\"structural\">...</span></span>","test.CommonBenchmark.longBenchmark","<span class=\"formatted\" title=\"test.CommonBenchmark.longBlackholeBenchmark\">test.CommonBenchmark.longBlackholeBen<span class=\"structural\">...</span></span>","test.JvmTestBenchmark.cosBenchmark"] }, \n", - "{ name: "<span title=\"barColor: String\">barColor</span>", children: [], rightAlign: false, values: ["neg","neg","neg","neg","neg","neg","neg","neg"] }, \n", - "], id: -1157627900, rootId: -1157627900, totalRows: 8 } ) });\n", + "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"name: String\">name</span>", children: [], rightAlign: false, values: ["test.InheritedBenchmark.baseBenchmark","<span class=\"formatted\" title=\"test.InheritedBenchmark.inheritedBenchmark\">test.InheritedBenchmark.inheritedBenc<span class=\"structural\">...</span></span>","test.ParamBenchmark.mathBenchmark","test.ParamBenchmark.mathBenchmark","test.ParamBenchmark.mathBenchmark","test.ParamBenchmark.mathBenchmark","test.ParamBenchmark.otherBenchmark","test.ParamBenchmark.otherBenchmark","test.ParamBenchmark.otherBenchmark","test.ParamBenchmark.otherBenchmark","test.ParamBenchmark.textContentCheck","test.ParamBenchmark.textContentCheck","test.ParamBenchmark.textContentCheck","test.ParamBenchmark.textContentCheck","<span class=\"formatted\" title=\"test.nested.CommonBenchmark.mathBenchmark\">test.nested.CommonBenchmark.mathBench<span class=\"structural\">...</span></span>","test.CommonBenchmark.longBenchmark","<span class=\"formatted\" title=\"test.CommonBenchmark.longBlackholeBenchmark\">test.CommonBenchmark.longBlackholeBen<span class=\"structural\">...</span></span>","test.CommonBenchmark.mathBenchmark","test.JvmTestBenchmark.cosBenchmark","test.JvmTestBenchmark.sqrtBenchmark"] }, \n", + "{ name: "<span title=\"params: String\">params</span>", children: [], rightAlign: false, values: ["","","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=1\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=1,text=a &#34;string&#34; with quotes,value=2\">data=1,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=1\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"data=2,text=a &#34;string&#34; with quotes,value=2\">data=2,text=a &#34;string&#34; with quotes,va<span class=\"structural\">...</span></span>","","","","","",""] }, \n", + "{ name: "<span title=\"mode: String\">mode</span>", children: [], rightAlign: false, values: ["thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","thrpt","avgt","avgt","avgt","avgt","avgt"] }, \n", + "{ name: "<span title=\"unit: String\">unit</span>", children: [], rightAlign: false, values: ["ops/s","ops/s","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ops/ms","ms/op","ms/op","ms/op","ns/op","ns/op"] }, \n", + "{ name: "<span title=\"score: Double\">score</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">999715.573058</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">132519854.002753</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">196902.036134</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">198982.020454</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">76487.508628</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">77218.536895</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2312642.773644</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2295922.938822</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2295223.364007</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2295128.593211</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">139497.981811</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">139472.551215</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">137951.951688</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">135829.985631</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">133932.193305</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.001020</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000026</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000008</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.971338</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.606598</span></span>"] }, \n", + "{ name: "<span title=\"range: ranges.ClosedFloatingPointRange<Double>\">range</span>", children: [], rightAlign: false, values: ["974954.2809652109..1024476.8651513313","<span class=\"formatted\" title=\"1.2936737342079675E8..1.3567233458470887E8\">1.2936737342079675E8..1.3567233458470<span class=\"structural\">...</span></span>","191654.7423267418..202149.32994077116","194497.3197739599..203466.72113419612","74595.04831374026..78379.96894260854","75599.16372724227..78837.91006301393","2091779.438724716..2533506.1085633924","2089935.2366487498..2501910.6409945134","2115768.594299648..2474678.1337146433","2082445.0002591067..2507812.186162458","135894.93943472698..143101.02418653402","135249.9703875965..143695.13204299458","133789.3696336104..142114.53374258292","131190.7048701939..140469.26639132493","129878.2239827778..137986.16262644873","<span class=\"formatted\" title=\"9.902780506238168E-4..0.0010504284290899577\">9.902780506238168E-4..0.0010504284290<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.5596365181913836E-5..2.6979490207589775E-5\">2.5596365181913836E-5..2.697949020758<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"7.456424871291536E-6..7.77349973367662E-6\">7.456424871291536E-6..7.7734997336766<span class=\"structural\">...</span></span>","3.8358525869703075..4.1068243414082675","0.5901377228601924..0.62305902250719"] }, \n", + "{ name: "<span title=\"score1: Double\">score1</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">1140852.957229</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">146792560.895807</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">217133.491804</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">216593.775142</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">86523.588517</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">85944.381961</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2616589.198790</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2629054.441671</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2646402.737052</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2652047.742142</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">154381.766970</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">153578.254496</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">153262.850584</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">153672.584595</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">148921.638469</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000854</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000023</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000007</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3.495849</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.541162</span></span>"] }, \n", + "{ name: "<span title=\"range1: ranges.ClosedFloatingPointRange<Double>\">range1</span>", children: [], rightAlign: false, values: ["1106659.7386652725..1175046.1757937148","<span class=\"formatted\" title=\"1.4482756334251586E8..1.4875755844909838E8\">1.4482756334251586E8..1.4875755844909<span class=\"structural\">...</span></span>","215027.16316066374..219239.82044761901","212594.8732753121..220592.677009433","82315.21514352418..90731.96188974172","81177.07416021802..90711.68976101496","2579570.7359826625..2653607.6615965427","2524752.102688715..2733356.780654085","2616649.4130033795..2676156.0611009924","2627344.681389795..2676750.802894536","153348.64196544446..155414.89197494255","150716.46891485332..156440.04007752796","150745.58896373163..155780.11220499463","150946.56541126606..156398.60377851175","148674.35770053475..149168.91923706495","<span class=\"formatted\" title=\"8.428241181867443E-4..8.649269988130904E-4\">8.428241181867443E-4..8.6492699881309<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"2.284205842928573E-5..2.3608924259914014E-5\">2.284205842928573E-5..2.3608924259914<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"6.685553120802533E-6..6.873011588250474E-6\">6.685553120802533E-6..6.8730115882504<span class=\"structural\">...</span></span>","3.48368627561432..3.5080116159522237","0.5348433328074729..0.5474798680717454"] }, \n", + "{ name: "<span title=\"diffScore: Double\">diffScore</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">141137.384171</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14272706.893054</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">20231.455670</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">17611.754688</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10036.079888</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">8725.845065</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">303946.425146</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">333131.502850</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">351179.373045</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">356919.148931</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14883.785160</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14105.703281</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">15310.898896</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">17842.598964</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14989.445164</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000166</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000003</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.000001</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.475490</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">0.065437</span></span>"] }, \n", + "{ name: "<span title=\"diffScorePercentage: Double\">diffScorePercentage</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">14.117754</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.770240</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.274884</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">8.850928</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">13.121201</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.300195</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">13.142818</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">14.509699</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">15.300444</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">15.551161</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.669534</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.113605</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.098719</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">13.135979</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.191816</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">16.315691</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.649592</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.974184</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">11.973029</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">10.787496</span></span>"] }, \n", + "{ name: "<span title=\"testLabel: String\">testLabel</span>", children: [], rightAlign: false, values: ["test.InheritedBenchmark.baseBenchmark","<span class=\"formatted\" title=\"test.InheritedBenchmark.inheritedBenchmark\">test.InheritedBenchmark.inheritedBenc<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.mathBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.mathBenchmark\n[da<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.otherBenchmark\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.otherBenchmark\n[d<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=1,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=1,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=2,text=a &#34;string&#34; with quotes,value=1]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.ParamBenchmark.textContentCheck\n[data=2,text=a &#34;string&#34; with quotes,value=2]\">test.ParamBenchmark.textContentCheck\n<span class=\"structural\">...</span></span>","<span class=\"formatted\" title=\"test.nested.CommonBenchmark.mathBenchmark\">test.nested.CommonBenchmark.mathBench<span class=\"structural\">...</span></span>","test.CommonBenchmark.longBenchmark","<span class=\"formatted\" title=\"test.CommonBenchmark.longBlackholeBenchmark\">test.CommonBenchmark.longBlackholeBen<span class=\"structural\">...</span></span>","test.CommonBenchmark.mathBenchmark","test.JvmTestBenchmark.cosBenchmark","test.JvmTestBenchmark.sqrtBenchmark"] }, \n", + "{ name: "<span title=\"barColor: String\">barColor</span>", children: [], rightAlign: false, values: ["pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos","pos"] }, \n", + "], id: -268435452, rootId: -268435452, totalRows: 20 } ) });\n", "/*-->*/\n", "\n", - "call_DataFrame(function() { DataFrame.renderTable(-1157627900) });\n", + "call_DataFrame(function() { DataFrame.renderTable(-268435452) });\n", "\n", "\n", " </script>\n", @@ -2589,18 +2465,26 @@ " \n", " \n", " \n", - "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms103082.844856102746.60675391225..103419.08295814389101173.75249399908.94648785368..102438.55849807907-1909.092363-1.851998test.ParamBenchmark.mathBenchmark\n", - "[da...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms155929.815236155267.27942953032..156592.35104171414150449.209123147414.465281937..153483.95296329833-5480.606113-3.514790test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms156259.919330155967.2972273164..156552.54143332926147058.565627140116.58313969668..154000.5481141382-9201.353703-5.888493test.ParamBenchmark.textContentCheck\n", - "...neg
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms155811.883306154012.99823010628..157610.76838288622146125.997244143504.1570471993..148747.83743989808-9685.886063-6.216398test.ParamBenchmark.textContentCheck\n", - "...neg
test.nested.CommonBenchmark.mathBench...thrptops/ms149758.678427149465.14095246932..150052.21590221935145509.901147143242.89296995336..147776.90932420595-4248.777280-2.837083test.nested.CommonBenchmark.mathBench...neg
test.CommonBenchmark.longBenchmarkavgtms/op0.0008448.372522775198425E-4..8.5116426929504...0.0008978.737790976669418E-4..9.2064844530355...-0.000053-6.278723test.CommonBenchmark.longBenchmarkneg
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000222.1394152325114E-5..2.190102450243732...0.0000242.3161777788037864E-5..2.422199277814...-0.000002-9.443532test.CommonBenchmark.longBlackholeBen...neg
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.4724853.4596934638924464..3.4852772244583043.5445403.5170213910539556..3.572058960798929-0.072055-2.075022test.JvmTestBenchmark.cosBenchmarkneg
\n", + "
nameparamsmodeunitscorerangescore1range1diffScorediffScorePercentagetestLabelbarColor
test.InheritedBenchmark.baseBenchmarkthrptops/s999715.573058974954.2809652109..1024476.86515133131140852.9572291106659.7386652725..1175046.1757937148141137.38417114.117754test.InheritedBenchmark.baseBenchmarkpos
test.InheritedBenchmark.inheritedBenc...thrptops/s132519854.0027531.2936737342079675E8..1.3567233458470...146792560.8958071.4482756334251586E8..1.4875755844909...14272706.89305410.770240test.InheritedBenchmark.inheritedBenc...pos
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms196902.036134191654.7423267418..202149.32994077116217133.491804215027.16316066374..219239.8204476190120231.45567010.274884test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.mathBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms198982.020454194497.3197739599..203466.72113419612216593.775142212594.8732753121..220592.67700943317611.7546888.850928test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms76487.50862874595.04831374026..78379.9689426085486523.58851782315.21514352418..90731.9618897417210036.07988813.121201test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.mathBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms77218.53689575599.16372724227..78837.9100630139385944.38196181177.07416021802..90711.689761014968725.84506511.300195test.ParamBenchmark.mathBenchmark\n", + "[da...pos
test.ParamBenchmark.otherBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms2312642.7736442091779.438724716..2533506.10856339242616589.1987902579570.7359826625..2653607.6615965427303946.42514613.142818test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.otherBenchmarkdata=1,text=a "string" with quotes,va...thrptops/ms2295922.9388222089935.2366487498..2501910.64099451342629054.4416712524752.102688715..2733356.780654085333131.50285014.509699test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2295223.3640072115768.594299648..2474678.13371464332646402.7370522616649.4130033795..2676156.0611009924351179.37304515.300444test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.otherBenchmarkdata=2,text=a "string" with quotes,va...thrptops/ms2295128.5932112082445.0002591067..2507812.1861624582652047.7421422627344.681389795..2676750.802894536356919.14893115.551161test.ParamBenchmark.otherBenchmark\n", + "[d...pos
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms139497.981811135894.93943472698..143101.02418653402154381.766970153348.64196544446..155414.8919749425514883.78516010.669534test.ParamBenchmark.textContentCheck\n", + "...pos
test.ParamBenchmark.textContentCheckdata=1,text=a "string" with quotes,va...thrptops/ms139472.551215135249.9703875965..143695.13204299458153578.254496150716.46891485332..156440.0400775279614105.70328110.113605test.ParamBenchmark.textContentCheck\n", + "...pos
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms137951.951688133789.3696336104..142114.53374258292153262.850584150745.58896373163..155780.1122049946315310.89889611.098719test.ParamBenchmark.textContentCheck\n", + "...pos
test.ParamBenchmark.textContentCheckdata=2,text=a "string" with quotes,va...thrptops/ms135829.985631131190.7048701939..140469.26639132493153672.584595150946.56541126606..156398.6037785117517842.59896413.135979test.ParamBenchmark.textContentCheck\n", + "...pos
test.nested.CommonBenchmark.mathBench...thrptops/ms133932.193305129878.2239827778..137986.16262644873148921.638469148674.35770053475..149168.9192370649514989.44516411.191816test.nested.CommonBenchmark.mathBench...pos
test.CommonBenchmark.longBenchmarkavgtms/op0.0010209.902780506238168E-4..0.0010504284290...0.0008548.428241181867443E-4..8.6492699881309...0.00016616.315691test.CommonBenchmark.longBenchmarkpos
test.CommonBenchmark.longBlackholeBen...avgtms/op0.0000262.5596365181913836E-5..2.697949020758...0.0000232.284205842928573E-5..2.3608924259914...0.00000311.649592test.CommonBenchmark.longBlackholeBen...pos
test.CommonBenchmark.mathBenchmarkavgtms/op0.0000087.456424871291536E-6..7.7734997336766...0.0000076.685553120802533E-6..6.8730115882504...0.00000110.974184test.CommonBenchmark.mathBenchmarkpos
test.JvmTestBenchmark.cosBenchmarkavgtns/op3.9713383.8358525869703075..4.10682434140826753.4958493.48368627561432..3.50801161595222370.47549011.973029test.JvmTestBenchmark.cosBenchmarkpos
test.JvmTestBenchmark.sqrtBenchmarkavgtns/op0.6065980.5901377228601924..0.623059022507190.5411620.5348433328074729..0.54747986807174540.06543710.787496test.JvmTestBenchmark.sqrtBenchmarkpos
\n", " \n", " \n", " " ], - "application/kotlindataframe+json": "{\"$version\":\"2.2.0\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":8,\"ncol\":12,\"is_formatted\":false},\"kotlin_dataframe\":[{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":103082.84485602807,\"range\":\"102746.60675391225..103419.08295814389\",\"score1\":101173.75249296638,\"range1\":\"99908.94648785368..102438.55849807907\",\"diffScore\":-1909.092363061689,\"diffScorePercentage\":-1.8519981338583025,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155929.81523562223,\"range\":\"155267.27942953032..156592.35104171414\",\"score1\":150449.20912261767,\"range1\":\"147414.465281937..153483.95296329833\",\"diffScore\":-5480.606113004556,\"diffScorePercentage\":-3.5147903591900813,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":156259.91933032282,\"range\":\"155967.2972273164..156552.54143332926\",\"score1\":147058.56562691744,\"range1\":\"140116.58313969668..154000.5481141382\",\"diffScore\":-9201.353703405388,\"diffScorePercentage\":-5.888492546802327,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"neg\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":155811.88330649625,\"range\":\"154012.99823010628..157610.76838288622\",\"score1\":146125.99724354869,\"range1\":\"143504.1570471993..148747.83743989808\",\"diffScore\":-9685.886062947568,\"diffScorePercentage\":-6.216397528482819,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"neg\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":149758.67842734433,\"range\":\"149465.14095246932..150052.21590221935\",\"score1\":145509.90114707965,\"range1\":\"143242.89296995336..147776.90932420595\",\"diffScore\":-4248.77728026468,\"diffScorePercentage\":-2.8370825149381784,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":8.442082734074419E-4,\"range\":\"8.372522775198425E-4..8.511642692950413E-4\",\"score1\":8.972137714852465E-4,\"range1\":\"8.737790976669418E-4..9.206484453035511E-4\",\"diffScore\":-5.3005498077804544E-5,\"diffScorePercentage\":-6.278722887168673,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.1647588413775662E-5,\"range\":\"2.1394152325114E-5..2.1901024502437323E-5\",\"score1\":2.369188528309145E-5,\"range1\":\"2.3161777788037864E-5..2.4221992778145036E-5\",\"diffScore\":-2.044296869315788E-6,\"diffScorePercentage\":-9.443531677712787,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"neg\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.472485344175375,\"range\":\"3.4596934638924464..3.485277224458304\",\"score1\":3.5445401759264423,\"range1\":\"3.5170213910539556..3.572058960798929\",\"diffScore\":-0.0720548317510672,\"diffScorePercentage\":-2.075021911091128,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"neg\"}]}" + "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"name\",\"params\",\"mode\",\"unit\",\"score\",\"range\",\"score1\",\"range1\",\"diffScore\",\"diffScorePercentage\",\"testLabel\",\"barColor\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.ranges.ClosedFloatingPointRange\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Double\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":20,\"ncol\":12},\"kotlin_dataframe\":[{\"name\":\"test.InheritedBenchmark.baseBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":999715.5730582711,\"range\":\"974954.2809652109..1024476.8651513313\",\"score1\":1140852.9572294937,\"range1\":\"1106659.7386652725..1175046.1757937148\",\"diffScore\":141137.38417122257,\"diffScorePercentage\":14.117753886684326,\"testLabel\":\"test.InheritedBenchmark.baseBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.InheritedBenchmark.inheritedBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/s\",\"score\":1.3251985400275281E8,\"range\":\"1.2936737342079675E8..1.3567233458470887E8\",\"score1\":1.4679256089580712E8,\"range1\":\"1.4482756334251586E8..1.4875755844909838E8\",\"diffScore\":1.4272706893054307E7,\"diffScorePercentage\":10.770240429602211,\"testLabel\":\"test.InheritedBenchmark.inheritedBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":196902.03613375648,\"range\":\"191654.7423267418..202149.32994077116\",\"score1\":217133.49180414138,\"range1\":\"215027.16316066374..219239.82044761901\",\"diffScore\":20231.455670384894,\"diffScorePercentage\":10.274883930931813,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":198982.020454078,\"range\":\"194497.3197739599..203466.72113419612\",\"score1\":216593.77514237256,\"range1\":\"212594.8732753121..220592.677009433\",\"diffScore\":17611.754688294546,\"diffScorePercentage\":8.85092766075268,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":76487.5086281744,\"range\":\"74595.04831374026..78379.96894260854\",\"score1\":86523.58851663295,\"range1\":\"82315.21514352418..90731.96188974172\",\"diffScore\":10036.079888458553,\"diffScorePercentage\":13.121201184949738,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.mathBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":77218.5368951281,\"range\":\"75599.16372724227..78837.91006301393\",\"score1\":85944.38196061649,\"range1\":\"81177.07416021802..90711.68976101496\",\"diffScore\":8725.845065488393,\"diffScorePercentage\":11.300194767143958,\"testLabel\":\"test.ParamBenchmark.mathBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2312642.7736440543,\"range\":\"2091779.438724716..2533506.1085633924\",\"score1\":2616589.1987896026,\"range1\":\"2579570.7359826625..2653607.6615965427\",\"diffScore\":303946.4251455483,\"diffScorePercentage\":13.142817758516887,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2295922.9388216315,\"range\":\"2089935.2366487498..2501910.6409945134\",\"score1\":2629054.4416714,\"range1\":\"2524752.102688715..2733356.780654085\",\"diffScore\":333131.5028497684,\"diffScorePercentage\":14.509698788964847,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2295223.3640071456,\"range\":\"2115768.594299648..2474678.1337146433\",\"score1\":2646402.737052186,\"range1\":\"2616649.4130033795..2676156.0611009924\",\"diffScore\":351179.3730450403,\"diffScorePercentage\":15.300444329388892,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.otherBenchmark\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":2295128.5932107824,\"range\":\"2082445.0002591067..2507812.186162458\",\"score1\":2652047.7421421655,\"range1\":\"2627344.681389795..2676750.802894536\",\"diffScore\":356919.14893138316,\"diffScorePercentage\":15.551161272060545,\"testLabel\":\"test.ParamBenchmark.otherBenchmark\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":139497.9818106305,\"range\":\"135894.93943472698..143101.02418653402\",\"score1\":154381.7669701935,\"range1\":\"153348.64196544446..155414.89197494255\",\"diffScore\":14883.785159563005,\"diffScorePercentage\":10.669534402130527,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=1,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":139472.55121529553,\"range\":\"135249.9703875965..143695.13204299458\",\"score1\":153578.25449619064,\"range1\":\"150716.46891485332..156440.04007752796\",\"diffScore\":14105.703280895104,\"diffScorePercentage\":10.113605263533874,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=1,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=1\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":137951.95168809665,\"range\":\"133789.3696336104..142114.53374258292\",\"score1\":153262.85058436313,\"range1\":\"150745.58896373163..155780.11220499463\",\"diffScore\":15310.898896266473,\"diffScorePercentage\":11.098718582020316,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=1]\",\"barColor\":\"pos\"},{\"name\":\"test.ParamBenchmark.textContentCheck\",\"params\":\"data=2,text=a \\\"string\\\" with quotes,value=2\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":135829.98563075942,\"range\":\"131190.7048701939..140469.26639132493\",\"score1\":153672.5845948889,\"range1\":\"150946.56541126606..156398.60377851175\",\"diffScore\":17842.598964129487,\"diffScorePercentage\":13.13597942403738,\"testLabel\":\"test.ParamBenchmark.textContentCheck\\n[data=2,text=a \\\"string\\\" with quotes,value=2]\",\"barColor\":\"pos\"},{\"name\":\"test.nested.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"thrpt\",\"unit\":\"ops/ms\",\"score\":133932.19330461326,\"range\":\"129878.2239827778..137986.16262644873\",\"score1\":148921.63846879985,\"range1\":\"148674.35770053475..149168.91923706495\",\"diffScore\":14989.445164186589,\"diffScorePercentage\":11.191816391817635,\"testLabel\":\"test.nested.CommonBenchmark.mathBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.CommonBenchmark.longBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":0.0010203532398568873,\"range\":\"9.902780506238168E-4..0.0010504284290899577\",\"score1\":8.538755584999174E-4,\"range1\":\"8.428241181867443E-4..8.649269988130904E-4\",\"diffScore\":1.6647768135696992E-4,\"diffScorePercentage\":16.31569096407434,\"testLabel\":\"test.CommonBenchmark.longBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":2.6287927694751805E-5,\"range\":\"2.5596365181913836E-5..2.6979490207589775E-5\",\"score1\":2.3225491344599873E-5,\"range1\":\"2.284205842928573E-5..2.3608924259914014E-5\",\"diffScore\":3.0624363501519328E-6,\"diffScorePercentage\":11.649592108256316,\"testLabel\":\"test.CommonBenchmark.longBlackholeBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.CommonBenchmark.mathBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ms/op\",\"score\":7.614962302484078E-6,\"range\":\"7.456424871291536E-6..7.77349973367662E-6\",\"score1\":6.779282354526504E-6,\"range1\":\"6.685553120802533E-6..6.873011588250474E-6\",\"diffScore\":8.356799479575747E-7,\"diffScorePercentage\":10.974183650061766,\"testLabel\":\"test.CommonBenchmark.mathBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.JvmTestBenchmark.cosBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":3.9713384641892873,\"range\":\"3.8358525869703075..4.1068243414082675\",\"score1\":3.4958489457832718,\"range1\":\"3.48368627561432..3.5080116159522237\",\"diffScore\":0.4754895184060155,\"diffScorePercentage\":11.973029312249324,\"testLabel\":\"test.JvmTestBenchmark.cosBenchmark\",\"barColor\":\"pos\"},{\"name\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"params\":\"\",\"mode\":\"avgt\",\"unit\":\"ns/op\",\"score\":0.6065983726836912,\"range\":\"0.5901377228601924..0.62305902250719\",\"score1\":0.5411616004396091,\"range1\":\"0.5348433328074729..0.5474798680717454\",\"diffScore\":0.06543677224408206,\"diffScorePercentage\":10.787495514466844,\"testLabel\":\"test.JvmTestBenchmark.sqrtBenchmark\",\"barColor\":\"pos\"}]}" }, "execution_count": 11, "metadata": {}, @@ -2611,14 +2495,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:04:42.619834Z", - "start_time": "2025-11-02T19:04:42.388164Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_41_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T23:01:13.586643Z", + "start_time": "2025-11-12T23:01:13.376316Z" } }, "cell_type": "code", @@ -2656,54 +2540,30 @@ { "data": { "text/html": [ - " \n", + "</html>\"> \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " -8\n", - " \n", - " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -6\n", + " \n", + " \n", + " 0\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -4\n", + " \n", + " \n", + " 5\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " -2\n", + " \n", + " \n", + " 10\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " 0\n", + " \n", + " \n", + " 15\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.CommonBenchmark.longBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=2]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=1,text=a "string" with quotes,value=1]\n", " \n", - " \n", - " [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=1,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.inheritedBenchmark\n", " \n", - " \n", - " [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.JvmTestBenchmark.sqrtBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.textContentCheck\n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.mathBenchmark\n", " \n", - " \n", - " [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=1]\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " test.nested.CommonBenchmark.mathBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBlackholeBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " test.JvmTestBenchmark.cosBenchmark\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " test.ParamBenchmark.mathBenchmark\n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.mathBenchmark [data=2,text=a "string" with quotes,value=1]\n", " \n", - " \n", - " [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.textContentCheck [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.InheritedBenchmark.baseBenchmark\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=1,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.ParamBenchmark.otherBenchmark [data=2,text=a "string" with quotes,value=2]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " test.CommonBenchmark.longBenchmark\n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3131,20 +3081,23 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " Diff %\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3152,39 +3105,75 @@ "mapping": {}, "data": { "testLabel": [ - "test.CommonBenchmark.longBlackholeBenchmark", - "test.CommonBenchmark.longBenchmark", - "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.mathBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", "test.ParamBenchmark.textContentCheck\n[data=1,text=a \"string\" with quotes,value=1]", + "test.InheritedBenchmark.inheritedBenchmark", + "test.JvmTestBenchmark.sqrtBenchmark", + "test.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=1]", "test.nested.CommonBenchmark.mathBenchmark", + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", + "test.CommonBenchmark.longBlackholeBenchmark", "test.JvmTestBenchmark.cosBenchmark", - "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=2]" + "test.ParamBenchmark.mathBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.textContentCheck\n[data=2,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=1]", + "test.InheritedBenchmark.baseBenchmark", + "test.ParamBenchmark.otherBenchmark\n[data=1,text=a \"string\" with quotes,value=2]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=1]", + "test.ParamBenchmark.otherBenchmark\n[data=2,text=a \"string\" with quotes,value=2]", + "test.CommonBenchmark.longBenchmark" ], "diffScorePercentage": [ - -9.443531677712787, - -6.278722887168673, - -6.216397528482819, - -5.888492546802327, - -3.5147903591900813, - -2.8370825149381784, - -2.075021911091128, - -1.8519981338583025 + 8.85092766075268, + 10.113605263533874, + 10.274883930931813, + 10.669534402130527, + 10.770240429602211, + 10.787495514466844, + 10.974183650061766, + 11.098718582020316, + 11.191816391817635, + 11.300194767143958, + 11.649592108256316, + 11.973029312249324, + 13.121201184949738, + 13.13597942403738, + 13.142817758516887, + 14.117753886684326, + 14.509698788964847, + 15.300444329388892, + 15.551161272060545, + 16.31569096407434 ], "barColor": [ - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg", - "neg" + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos", + "pos" ] }, "ggsize": { "width": 800.0, - "height": 420.0 + "height": 900.0 }, "kind": "plot", "scales": [ diff --git a/examples/simple-benchmark-analysis.ipynb b/examples/simple-benchmark-analysis.ipynb index 1c2a8dff..ae3b3745 100644 --- a/examples/simple-benchmark-analysis.ipynb +++ b/examples/simple-benchmark-analysis.ipynb @@ -22,10 +22,6 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:14:45.478863Z", - "start_time": "2025-11-02T19:14:42.525850Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_3_jupyter", @@ -43,6 +39,10 @@ "Line_15_jupyter", "Line_16_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T22:48:39.666949Z", + "start_time": "2025-11-12T22:48:35.274977Z" } }, "cell_type": "code", @@ -52,43 +52,34 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:14:46.021638Z", - "start_time": "2025-11-02T19:14:45.493509Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_17_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T22:48:40.134692Z", + "start_time": "2025-11-12T22:48:39.676285Z" } }, "cell_type": "code", "source": [ - "// Serialization classes matching the JMH JSON format.\n", + "// Serialization classes matching the JMH-alike JSON format.\n", "// We define these classes manually so we can keep `params` as a JsonObject, as it means we can handle them\n", "// in a generic manner. If you benchmark have fixed params, using `\"\".deserializeThis()` is\n", "// faster and easier.\n", "\n", "@Serializable\n", "public data class Benchmark(\n", - " public val jmhVersion: String,\n", " public val benchmark: String,\n", " public val mode: String,\n", - " public val threads: Int,\n", - " public val forks: Int,\n", - " public val jvm: String,\n", - " public val jvmArgs: List,\n", - " public val jdkVersion: String,\n", - " public val vmName: String,\n", - " public val vmVersion: String,\n", + " public val forks: Int = 1,\n", " public val warmupIterations: Int,\n", " public val warmupTime: String,\n", - " public val warmupBatchSize: Int,\n", " public val measurementIterations: Int,\n", " public val measurementTime: String,\n", - " public val measurementBatchSize: Int,\n", " public val primaryMetric: PrimaryMetric,\n", - " public val secondaryMetrics: SecondaryMetrics,\n", + " public val secondaryMetrics: Map,\n", " public val params: JsonObject? = null\n", ")\n", "\n", @@ -97,51 +88,24 @@ " public val score: Double,\n", " public val scoreError: Double,\n", " public val scoreConfidence: List,\n", - " public val scorePercentiles: ScorePercentiles,\n", + " public val scorePercentiles: Map,\n", " public val scoreUnit: String,\n", " public val rawData: List>,\n", - ")\n", - "\n", - "@Serializable\n", - "public data class ScorePercentiles(\n", - " @SerialName(\"0.0\")\n", - " public val `value`: Double,\n", - " @SerialName(\"50.0\")\n", - " public val value1: Double,\n", - " @SerialName(\"90.0\")\n", - " public val value2: Double,\n", - " @SerialName(\"95.0\")\n", - " public val value3: Double,\n", - " @SerialName(\"99.0\")\n", - " public val value4: Double,\n", - " @SerialName(\"99.9\")\n", - " public val value5: Double,\n", - " @SerialName(\"99.99\")\n", - " public val value6: Double,\n", - " @SerialName(\"99.999\")\n", - " public val value7: Double,\n", - " @SerialName(\"99.9999\")\n", - " public val value8: Double,\n", - " @SerialName(\"100.0\")\n", - " public val value9: Double,\n", - ")\n", - "\n", - "@Serializable\n", - "public data object SecondaryMetrics" + ")" ], "outputs": [], "execution_count": 2 }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:14:46.537814Z", - "start_time": "2025-11-02T19:14:46.023791Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_18_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T22:48:40.498796Z", + "start_time": "2025-11-12T22:48:40.140479Z" } }, "cell_type": "code", @@ -169,14 +133,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:14:46.864102Z", - "start_time": "2025-11-02T19:14:46.539005Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_19_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T22:48:40.759773Z", + "start_time": "2025-11-12T22:48:40.509312Z" } }, "cell_type": "code", @@ -224,14 +188,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:14:47.320141Z", - "start_time": "2025-11-02T19:14:46.872111Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_20_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T22:48:40.943415Z", + "start_time": "2025-11-12T22:48:40.765765Z" } }, "cell_type": "code", @@ -260,14 +224,14 @@ }, { "metadata": { - "ExecuteTime": { - "end_time": "2025-11-02T19:14:48.540608Z", - "start_time": "2025-11-02T19:14:47.405919Z" - }, "executionRelatedData": { "compiledClasses": [ "Line_21_jupyter" ] + }, + "ExecuteTime": { + "end_time": "2025-11-12T22:48:41.489622Z", + "start_time": "2025-11-12T22:48:40.953044Z" } }, "cell_type": "code", @@ -325,10 +289,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -336,41 +297,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2e+7\n", + " \n", + " \n", + " \n", + " 20M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 4e+7\n", + " \n", + " \n", + " \n", + " 40M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 6e+7\n", + " \n", + " \n", + " \n", + " 60M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 8e+7\n", + " \n", + " \n", + " \n", + " 80M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1e+8\n", + " \n", + " \n", + " \n", + " 100M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.2e+8\n", + " \n", + " \n", + " \n", + " 120M\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.4e+8\n", + " \n", + " \n", + " \n", + " 140M\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " base\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " inherited\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -796,9 +714,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/s\n", " \n", @@ -806,10 +727,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -826,20 +747,20 @@ }, "data": { "score": [ - 1104972.6706894366, - 1.4634989745609665E8 + 999715.5730582711, + 1.3251985400275281E8 ], "errorMax": [ - 1154281.987920151, - 1.489669832012015E8 + 1024476.8651513313, + 1.3567233458470887E8 ], "label": [ "base", "inherited" ], "errorMin": [ - 1055663.3534587221, - 1.437328117109918E8 + 974954.2809652109, + 1.2936737342079675E8 ] }, "ggsize": { @@ -942,10 +863,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -954,10 +872,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -965,41 +880,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 50,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 150,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 200,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1464,9 +1312,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -1474,10 +1325,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -1494,16 +1345,16 @@ }, "data": { "score": [ - 213019.57841385395, - 214917.7241256119, - 102424.75929129767, - 101173.75249296638 + 196902.03613375648, + 198982.020454078, + 76487.5086281744, + 77218.5368951281 ], "errorMax": [ - 221389.10361238578, - 221219.12070789465, - 103736.05191104818, - 102438.55849807907 + 202149.32994077116, + 203466.72113419612, + 78379.96894260854, + 78837.91006301393 ], "label": [ "data=1\ntext=a \"string\" with quotes\nvalue=1", @@ -1512,10 +1363,10 @@ "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 204650.0532153221, - 208616.32754332913, - 101113.46667154715, - 99908.94648785368 + 191654.7423267418, + 194497.3197739599, + 74595.04831374026, + 75599.16372724227 ] }, "ggsize": { @@ -1618,10 +1469,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -1630,10 +1478,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -1641,41 +1486,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 500,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1e+6\n", + " \n", + " \n", + " \n", + " 1,000,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1.5e+6\n", + " \n", + " \n", + " \n", + " 1,500,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2e+6\n", + " \n", + " \n", + " \n", + " 2,000,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2.5e+6\n", + " \n", + " \n", + " \n", + " 2,500,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2149,9 +1927,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -2159,10 +1940,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -2179,16 +1960,16 @@ }, "data": { "score": [ - 2680506.786160648, - 2585022.6644677366, - 2614856.4118722673, - 2585237.244524414 + 2312642.7736440543, + 2295922.9388216315, + 2295223.3640071456, + 2295128.5932107824 ], "errorMax": [ - 2714141.3425343693, - 2715267.760476164, - 2648971.483481024, - 2618115.998457625 + 2533506.1085633924, + 2501910.6409945134, + 2474678.1337146433, + 2507812.186162458 ], "label": [ "data=1\ntext=a \"string\" with quotes\nvalue=1", @@ -2197,10 +1978,10 @@ "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 2646872.2297869264, - 2454777.568459309, - 2580741.3402635106, - 2552358.4905912033 + 2091779.438724716, + 2089935.2366487498, + 2115768.594299648, + 2082445.0002591067 ] }, "ggsize": { @@ -2303,10 +2084,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -2315,10 +2093,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -2326,41 +2101,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 20,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 40,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 60,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 80,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 120,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 140,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 160,000\n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=1\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=1 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=1\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=1\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " data=2\n", - " \n", - " \n", - " text=a "string" with quotes\n", - " \n", - " \n", - " value=2\n", + " \n", + " \n", + " data=2 text=a "string" with quotes value=2\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2861,9 +2560,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -2871,10 +2573,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -2891,16 +2593,16 @@ }, "data": { "score": [ - 150449.20912261767, - 147058.56562691744, - 146125.99724354869, - 150019.93211383233 + 139497.9818106305, + 139472.55121529553, + 137951.95168809665, + 135829.98563075942 ], "errorMax": [ - 153483.95296329833, - 154000.5481141382, - 148747.83743989808, - 154158.57892833705 + 143101.02418653402, + 143695.13204299458, + 142114.53374258292, + 140469.26639132493 ], "label": [ "data=1\ntext=a \"string\" with quotes\nvalue=1", @@ -2909,10 +2611,10 @@ "data=2\ntext=a \"string\" with quotes\nvalue=2" ], "errorMin": [ - 147414.465281937, - 140116.58313969668, - 143504.1570471993, - 145881.2852993276 + 135894.93943472698, + 135249.9703875965, + 133789.3696336104, + 131190.7048701939 ] }, "ggsize": { @@ -3015,10 +2717,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -3027,10 +2726,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -3038,41 +2734,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " 0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 20,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 40,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 60,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 80,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 100,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 120,000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 140,000\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " math\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3477,9 +3130,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ops/ms\n", " \n", @@ -3487,10 +3143,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -3507,16 +3163,16 @@ }, "data": { "score": [ - 145509.90114707965 + 133932.19330461326 ], "errorMax": [ - 147776.90932420595 + 137986.16262644873 ], "label": [ "math" ], "errorMin": [ - 143242.89296995336 + 129878.2239827778 ] }, "ggsize": { @@ -3619,10 +3275,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -3631,10 +3284,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -3642,41 +3292,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " 0\n", + " \n", + " \n", + " 0.0000\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0001\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0002\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0003\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0004\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0005\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0006\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0007\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0008\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.0009\n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " 0.0010\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 0.0011\n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " long\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " longBlackhole\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " math\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4141,9 +3766,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ms/op\n", " \n", @@ -4151,10 +3779,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -4171,14 +3799,14 @@ }, "data": { "score": [ - 8.972137714852465E-4, - 2.369188528309145E-5, - 6.7916806977233165E-6 + 0.0010203532398568873, + 2.6287927694751805E-5, + 7.614962302484078E-6 ], "errorMax": [ - 9.206484453035511E-4, - 2.4221992778145036E-5, - 6.8730920645926235E-6 + 0.0010504284290899577, + 2.6979490207589775E-5, + 7.77349973367662E-6 ], "label": [ "long", @@ -4186,9 +3814,9 @@ "math" ], "errorMin": [ - 8.737790976669418E-4, - 2.3161777788037864E-5, - 6.710269330854009E-6 + 9.902780506238168E-4, + 2.5596365181913836E-5, + 7.456424871291536E-6 ] }, "ggsize": { @@ -4291,10 +3919,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -4303,10 +3928,7 @@ ] }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" }, { "data": { @@ -4314,41 +3936,17 @@ " \n", + "</html>\"> \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " 0\n", + " \n", + " \n", + " 0.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 0.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 1\n", + " \n", + " \n", + " \n", + " 1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 2\n", + " \n", + " \n", + " \n", + " 2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 2.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " 3\n", + " \n", + " \n", + " \n", + " 3.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " 3.5\n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " 4.0\n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " cos\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " sqrt\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4774,9 +4362,12 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " ns/op\n", " \n", @@ -4784,10 +4375,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", "\n", - " " + " " ], "application/plot+json": { "output_type": "lets_plot_spec", @@ -4804,20 +4395,20 @@ }, "data": { "score": [ - 3.5445401759264423, - 0.5428283650466172 + 3.9713384641892873, + 0.6065983726836912 ], "errorMax": [ - 3.572058960798929, - 0.5468378157356791 + 4.1068243414082675, + 0.62305902250719 ], "label": [ "cos", "sqrt" ], "errorMin": [ - 3.5170213910539556, - 0.5388189143575554 + 3.8358525869703075, + 0.5901377228601924 ] }, "ggsize": { @@ -4920,10 +4511,7 @@ } }, "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } + "output_type": "display_data" } ], "execution_count": 6 From 5b80b8c590995a7dd2dee72789ca3e0f8c066a61 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Wed, 12 Nov 2025 18:21:22 -0500 Subject: [PATCH 6/9] Add an example project comparing hypothesis --- .../build.gradle.kts | 31 ++++++++++ .../main/src/InverseSquareRootBenchmark.kt | 56 +++++++++++++++++++ settings.gradle.kts | 1 + 3 files changed, 88 insertions(+) create mode 100644 examples/kotlin-jvm-compare-hypothesis/build.gradle.kts create mode 100644 examples/kotlin-jvm-compare-hypothesis/main/src/InverseSquareRootBenchmark.kt diff --git a/examples/kotlin-jvm-compare-hypothesis/build.gradle.kts b/examples/kotlin-jvm-compare-hypothesis/build.gradle.kts new file mode 100644 index 00000000..1bc40a2b --- /dev/null +++ b/examples/kotlin-jvm-compare-hypothesis/build.gradle.kts @@ -0,0 +1,31 @@ +import kotlinx.benchmark.gradle.* + +plugins { + kotlin("jvm") + id("org.jetbrains.kotlinx.benchmark") +} + +sourceSets.configureEach { + java.setSrcDirs(listOf("$name/src")) + resources.setSrcDirs(listOf("$name/resources")) +} +dependencies { + implementation(project(":kotlinx-benchmark-runtime")) +} + +kotlin { + jvmToolchain(8) +} + +benchmark { + configurations { + named("main") { + iterationTime = 5 + iterationTimeUnit = "sec" + + } + } + targets { + register("main") + } +} diff --git a/examples/kotlin-jvm-compare-hypothesis/main/src/InverseSquareRootBenchmark.kt b/examples/kotlin-jvm-compare-hypothesis/main/src/InverseSquareRootBenchmark.kt new file mode 100644 index 00000000..38f28c94 --- /dev/null +++ b/examples/kotlin-jvm-compare-hypothesis/main/src/InverseSquareRootBenchmark.kt @@ -0,0 +1,56 @@ +package test + +import kotlinx.benchmark.* +import org.openjdk.jmh.annotations.Fork +import kotlin.math.pow +import kotlin.math.sqrt +import kotlin.random.Random + +@State(Scope.Benchmark) +@Fork(1) +@Warmup(iterations = 3, time = 1, timeUnit = BenchmarkTimeUnit.SECONDS) +@Measurement(iterations = 3, time = 1, timeUnit = BenchmarkTimeUnit.SECONDS) +open class InverseSquareRootBenchmark { + private var data = Random.nextFloat() + + @Benchmark + fun invSqrtBaseline(): Float { + return 1.0f / sqrt(data) + } + + @Benchmark + fun invSqrtOptimized(): Float { + return fastInvSqrt(data) + } +} + +@State(Scope.Benchmark) +@Fork(1) +@Warmup(iterations = 3, time = 1, timeUnit = BenchmarkTimeUnit.SECONDS) +@Measurement(iterations = 3, time = 1, timeUnit = BenchmarkTimeUnit.SECONDS) +open class PowerBenchmark { + @Param("2.71") + var power: Double = 0.0 + + @Param("-3.0", "421431.243214") + var value: Double = 0.0 + + @Benchmark + fun powerBaseline(): Double = value.pow(power) + + @Benchmark + fun powerOptimized(): Double = fastPower(value, power) +} + +// See https://en.wikipedia.org/wiki/Fast_inverse_square_root +private fun fastInvSqrt(x: Float): Float { + val y = Float.fromBits(0x5f3759df - (x.toBits() shr 1)) + return y * (1.5F - (x * 0.5F * y * y)) +} + +// Credits: https://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ +private fun fastPower(a: Double, b: Double): Double { + val tmp = a.toBits() + val tmp2 = (b * (tmp - 4606921280493453312L)).toLong() + 4606921280493453312L + return Double.fromBits(tmp2) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index d2984b40..ce1be649 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,3 +41,4 @@ include(":examples:kotlin-multiplatform") include(":examples:java") include(":examples:kotlin-jvm-separate-benchmark-source-set") include(":examples:kotlin-jvm") +include(":examples:kotlin-jvm-compare-hypothesis") From fdaa685fcb737c49a8a5c1445dada48756bba8a0 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Wed, 12 Nov 2025 18:22:49 -0500 Subject: [PATCH 7/9] Add a notebook to compare benchmarks from a single run --- examples/compare-hypothesis.ipynb | 1366 +++++++++++++++++++++++++++++ 1 file changed, 1366 insertions(+) create mode 100644 examples/compare-hypothesis.ipynb diff --git a/examples/compare-hypothesis.ipynb b/examples/compare-hypothesis.ipynb new file mode 100644 index 00000000..3ee58a84 --- /dev/null +++ b/examples/compare-hypothesis.ipynb @@ -0,0 +1,1366 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# Compare Benchmarks with each other\n", + "This notebook demonstrates how you can analyze results for the two benchmark functions, one measuring performance for some baseline implementation, and another for the proposed optimized implementation.\n", + "\n", + "Such an approach could be handy when it is possible to use two alternative implementations simultaneously (which is usually the case).\n", + "\n", + "The notebook assumes that benchmark functions for baseline implementation has the \"Baseline\" suffix in their names, and optimized (or changed) alternative implementations has the \"Optimized\" suffix in their names. For example, `invSqrtBaseline` and `invSqrtOptimized`.\n", + "\n", + "While this example uses a JVM-only project, the notebook could be applied to results collected from multiplatform benchmarks as well.\n", + "\n", + "First, you need to run benchmarks. This can be done by running the following command from the root of the project:\n", + "\n", + "```shell\n", + "> ./gradlew :examples:kotlin-jvm-compare-hypothesis:benchmark\n", + "```\n", + "\n", + "Once it is completed, run this notebook, and it will automatically find the latest result." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:54.464923Z", + "start_time": "2025-11-12T23:20:49.670002Z" + } + }, + "cell_type": "code", + "source": "%use serialization, dataframe, kandy", + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:54.900251Z", + "start_time": "2025-11-12T23:20:54.471334Z" + } + }, + "cell_type": "code", + "source": [ + "// Serialization classes matching the JMH-alike JSON format.\n", + "// We define these classes manually so we can keep `params` as a JsonObject, as it means we can handle them\n", + "// in a generic manner. If you benchmark have fixed params, using `\"\".deserializeThis()` is\n", + "// faster and easier.\n", + "\n", + "@Serializable\n", + "public data class Benchmark(\n", + " public val benchmark: String,\n", + " public val mode: String,\n", + " public val warmupIterations: Int,\n", + " public val warmupTime: String,\n", + " public val measurementIterations: Int,\n", + " public val measurementTime: String,\n", + " public val primaryMetric: PrimaryMetric,\n", + " public val secondaryMetrics: Map,\n", + " public val params: JsonObject? = null\n", + ")\n", + "\n", + "@Serializable\n", + "public data class PrimaryMetric(\n", + " public val score: Double,\n", + " public val scoreError: Double,\n", + " public val scoreConfidence: List,\n", + " public val scorePercentiles: Map,\n", + " public val scoreUnit: String,\n", + " public val rawData: List>,\n", + ")" + ], + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:55.023965Z", + "start_time": "2025-11-12T23:20:54.947559Z" + } + }, + "cell_type": "code", + "source": [ + "// Benchmarks for a \"baseline\" implementation have a \"Baseline\" suffix in their names,\n", + "// while benchmarks for an \"opimized\" implementation have a \"Optimized\" suffix.\n", + "val baselineSuffix = \"Baseline\"\n", + "val optimizedSuffix = \"Optimized\"" + ], + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:55.512756Z", + "start_time": "2025-11-12T23:20:55.032052Z" + } + }, + "cell_type": "code", + "source": [ + "import kotlinx.serialization.json.Json\n", + "import java.nio.file.Files\n", + "import java.nio.file.attribute.BasicFileAttributes\n", + "import kotlin.io.path.exists\n", + "import kotlin.io.path.forEachDirectoryEntry\n", + "import kotlin.io.path.isDirectory\n", + "import kotlin.io.path.listDirectoryEntries\n", + "import kotlin.io.path.readText\n", + "\n", + "// Find latest result file, based on the their timestamp.\n", + "val runsDir = notebook.workingDir.resolve(\"kotlin-jvm-compare-hypothesis/build/reports/benchmarks/main\")\n", + "val lastRunDir = runsDir.listDirectoryEntries()\n", + " .filter { it.isDirectory() }\n", + " .sortedByDescending { dir -> Files.readAttributes(dir, BasicFileAttributes::class.java).creationTime() }\n", + " .first()\n", + "val outputFile = lastRunDir.resolve(\"main.json\")\n", + "val json = Json { ignoreUnknownKeys = true }\n", + "val benchmarkData = json.decodeFromString>(outputFile.readText())" + ], + "outputs": [], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:55.815900Z", + "start_time": "2025-11-12T23:20:55.517639Z" + } + }, + "cell_type": "code", + "source": [ + "import kotlinx.serialization.json.*\n", + "\n", + "// Helper class for tracking the information we need to use.\n", + "data class Benchmark(val name: String, val params: String, val score: Double, val error: Double, val unit: String)\n", + "\n", + "// Split benchmark results into groups. Generally, each group consist of all tests from one test file,\n", + "// except when it is an parameterized test. In this case, each test (with all its variants) are put\n", + "// in its own group.\n", + "val benchmarkGroups = benchmarkData\n", + " .groupBy {\n", + " if (it.benchmark.endsWith(optimizedSuffix))\n", + " it.benchmark.removeSuffix(optimizedSuffix)\n", + " else\n", + " it.benchmark.removeSuffix(baselineSuffix)\n", + " }\n", + " .mapValues { group ->\n", + " val benchmarks = group.value.map { benchmark ->\n", + " // Parameters are specific to each test. `deserializeJson()` will generate the appropriate data classes,\n", + " // but for generic handling of parameters we would need to fallback to reading the JSON. In this case\n", + " // we just handle them through the typed API.\n", + " val paramInfo = benchmark.params?.entries.orEmpty()\n", + " .sortedBy { it.key }\n", + " .joinToString(\",\") { \"${it.key}=${it.value.jsonPrimitive.content}\" }\n", + " val name = benchmark.benchmark\n", + " Benchmark(\n", + " name,\n", + " paramInfo,\n", + " benchmark.primaryMetric.score,\n", + " benchmark.primaryMetric.scoreError,\n", + " benchmark.primaryMetric.scoreUnit\n", + " )\n", + " }\n", + " val baseline = benchmarks.filter { it.name.endsWith(\"Baseline\") }.toDataFrame()\n", + " val optimized = benchmarks.filter { it.name.endsWith(\"Optimized\") }.toDataFrame()\n", + " baseline.join(optimized, \"params\")\n", + " }\n", + "\n", + "// Un-commont this to see the benchmark data as DataFrames\n", + "// benchmarkGroups.forEach {\n", + "// DISPLAY(it.value)\n", + "// }" + ], + "outputs": [], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:56.182074Z", + "start_time": "2025-11-12T23:20:55.820371Z" + } + }, + "cell_type": "code", + "source": [ + "// Prepare the data frames for plotting by:\n", + "// - Add calculated columns for errorMin / errorMax, for both the baseline and optimized \"versions\"\n", + "// - Tests with parameters use the parameter values as the label\n", + "// - Tests without paramaters use the test name as the label\n", + "val plotData = benchmarkGroups.mapValues {\n", + " it.value\n", + " .add(\"errorMin\") { it.getValue(\"score\") - it.getValue(\"error\") }\n", + " .add(\"errorMax\") { it.getValue(\"score\") + it.getValue(\"error\") }\n", + " .add(\"errorMin1\") { it.getValue(\"score1\") - it.getValue(\"error1\") }\n", + " .add(\"errorMax1\") { it.getValue(\"score1\") + it.getValue(\"error1\") }\n", + " .add(\"diff\") { (it.getValue(\"score1\") - it.getValue(\"score\")) / it.getValue(\"score\") * 100.0 }\n", + " .insert(\"label\") {\n", + " // Re-format the benchmark labels to make them look \"nicer\"\n", + " if (!it.getValue(\"params\").isBlank()) {\n", + " it.getValue(\"params\").replace(\",\", \"\\n\")\n", + " } else {\n", + " it.getValue(\"name\").substringAfterLast(\".\").removeSuffix(baselineSuffix)\n", + " }\n", + " }.at(0)\n", + " .add(\"barColor\") {\n", + " val diff = get(\"diff\") as Double\n", + " val interval1 = (get(\"errorMin\") as Double)..(get(\"errorMax\") as Double)\n", + " val interval2 = (get(\"errorMin1\") as Double)..(get(\"errorMax1\") as Double)\n", + " val overlap = interval1.start <= interval2.endInclusive && interval2.start <= interval1.endInclusive\n", + " when {\n", + " overlap -> \"grey\"\n", + " diff > 0 -> \"green\"\n", + " else -> \"red\"\n", + " }\n", + " }\n", + " .remove(\"name\", \"params\")\n", + "}" + ], + "outputs": [], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-12T23:20:56.633229Z", + "start_time": "2025-11-12T23:20:56.186639Z" + } + }, + "cell_type": "code", + "source": [ + "import org.jetbrains.letsPlot.Geom\n", + "import org.jetbrains.letsPlot.core.spec.plotson.coord\n", + "import org.jetbrains.letsPlot.themes.margin\n", + "\n", + "// Plot each group as a bar plot with the error displayed as error bars.\n", + "// This approach assumes that each group has tests roughly within the same \"scale\".\n", + "// If this is not the case, some plots might look very squished. If this happens,\n", + "// you can play around with using a LOG10 scale or modifying the limits to focus\n", + "// on the changes.\n", + "plotData.forEach { (fileName, dataframe) ->\n", + " val plot = dataframe.plot {\n", + " bars {\n", + " x(\"label\") {\n", + " axis.name = \"\"\n", + " }\n", + " y(\"diff\")\n", + " fillColor(\"barColor\") {\n", + " scale = categorical(\"red\" to Color.RED, \"green\" to Color.GREEN, \"grey\" to Color.GREY)\n", + " legend.type = LegendType.None\n", + " }\n", + " }\n", + " coordinatesTransformation = CoordinatesTransformation.cartesianFlipped()\n", + " layout {\n", + " this.yAxisLabel = \"Diff, %\"\n", + " style {\n", + " global {\n", + " title {\n", + " margin(10.0, -10.0)\n", + " }\n", + " text {\n", + " fontFamily = FontFamily.MONO\n", + " }\n", + " }\n", + " }\n", + " // Adjust the height of the Kandy plot based on the number of tests.\n", + " size = 800 to ((50 * dataframe.size().nrow) + 100)\n", + " }\n", + " }\n", + " DISPLAY(HTML(\"

$fileName

\"))\n", + " DISPLAY(plot)\n", + "}" + ], + "outputs": [ + { + "data": { + "text/html": [ + "

test.InverseSquareRootBenchmark.invSqrt

" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -20\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -18\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -16\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -14\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -12\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -10\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -6\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " invSqrt\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " Diff, %\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " " + ], + "application/plot+json": { + "output_type": "lets_plot_spec", + "output": { + "mapping": {}, + "guides": { + "y": { + "title": "Diff, %" + } + }, + "coord": { + "name": "flip", + "flip": true + }, + "data": { + "diff": [ + -19.336985717494702 + ], + "label": [ + "invSqrt" + ], + "barColor": [ + "red" + ] + }, + "ggsize": { + "width": 800.0, + "height": 150.0 + }, + "kind": "plot", + "scales": [ + { + "aesthetic": "x", + "discrete": true, + "name": "" + }, + { + "aesthetic": "y", + "limits": [ + null, + null + ] + }, + { + "aesthetic": "fill", + "values": [ + "#ee6666", + "#3ba272", + "#a39999" + ], + "limits": [ + "red", + "green", + "grey" + ], + "guide": "none" + } + ], + "layers": [ + { + "mapping": { + "x": "label", + "y": "diff", + "fill": "barColor" + }, + "stat": "identity", + "sampling": "none", + "inherit_aes": false, + "position": "dodge", + "geom": "bar" + } + ], + "theme": { + "text": { + "family": "mono", + "blank": false + }, + "title": { + "margin": [ + 10.0, + -10.0, + 10.0, + -10.0 + ], + "blank": false + }, + "axis_ontop": false, + "axis_ontop_y": false, + "axis_ontop_x": false + }, + "data_meta": { + "series_annotations": [ + { + "type": "str", + "column": "label" + }, + { + "type": "float", + "column": "diff" + }, + { + "type": "str", + "column": "barColor" + } + ] + } + }, + "apply_color_scheme": true, + "swing_enabled": true + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

test.PowerBenchmark.power

" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 200\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 400\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 600\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 800\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 1,000\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 1,200\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 1,400\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 1,600\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " power=2.71 value=-3.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " power=2.71 value=421431.243214\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " Diff, %\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " " + ], + "application/plot+json": { + "output_type": "lets_plot_spec", + "output": { + "mapping": {}, + "guides": { + "y": { + "title": "Diff, %" + } + }, + "coord": { + "name": "flip", + "flip": true + }, + "data": { + "diff": [ + 132.5126341566779, + 1549.7214684405087 + ], + "label": [ + "power=2.71\nvalue=-3.0", + "power=2.71\nvalue=421431.243214" + ], + "barColor": [ + "green", + "green" + ] + }, + "ggsize": { + "width": 800.0, + "height": 200.0 + }, + "kind": "plot", + "scales": [ + { + "aesthetic": "x", + "discrete": true, + "name": "" + }, + { + "aesthetic": "y", + "limits": [ + null, + null + ] + }, + { + "aesthetic": "fill", + "values": [ + "#ee6666", + "#3ba272", + "#a39999" + ], + "limits": [ + "red", + "green", + "grey" + ], + "guide": "none" + } + ], + "layers": [ + { + "mapping": { + "x": "label", + "y": "diff", + "fill": "barColor" + }, + "stat": "identity", + "sampling": "none", + "inherit_aes": false, + "position": "dodge", + "geom": "bar" + } + ], + "theme": { + "text": { + "family": "mono", + "blank": false + }, + "title": { + "margin": [ + 10.0, + -10.0, + 10.0, + -10.0 + ], + "blank": false + }, + "axis_ontop": false, + "axis_ontop_y": false, + "axis_ontop_x": false + }, + "data_meta": { + "series_annotations": [ + { + "type": "str", + "column": "label" + }, + { + "type": "float", + "column": "diff" + }, + { + "type": "str", + "column": "barColor" + } + ] + } + }, + "apply_color_scheme": true, + "swing_enabled": true + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 7 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Kotlin", + "language": "kotlin", + "name": "kotlin" + }, + "language_info": { + "name": "kotlin", + "version": "2.2.20-dev-4982", + "mimetype": "text/x-kotlin", + "file_extension": ".kt", + "pygments_lexer": "kotlin", + "codemirror_mode": "text/x-kotlin", + "nbconvert_exporter": "" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 0b7cd60a44b075e1a639c2ec3bbacf6c8da9f3fe Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Wed, 12 Nov 2025 18:27:19 -0500 Subject: [PATCH 8/9] Include hypothesis comparison notebook into README --- README.md | 2 ++ docs/notebooks-compare-hypothesis-demo.png | Bin 0 -> 42657 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/notebooks-compare-hypothesis-demo.png diff --git a/README.md b/README.md index c34ce124..07499216 100644 --- a/README.md +++ b/README.md @@ -446,6 +446,8 @@ Namely, ![SingleRunAnalysis](docs/notebooks-single-run-demo.png) - [Comparing different runs with each other](examples/compare-benchmark-runs.ipynb) ![MultiRunAnalysis](docs/notebooks-multi-run-demo.png) +- [Comparing benchmark functions from the same run with each other](examples/compare-hypothesis.ipynb) + ![HypothesisAnalysis](docs/notebooks-compare-hypothesis-demo.png) You can always copy these notebooks into your projects and adapt for your particular needs. diff --git a/docs/notebooks-compare-hypothesis-demo.png b/docs/notebooks-compare-hypothesis-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee4b8f0ce0900c31f6f9d31019e8f102d1d8ca4 GIT binary patch literal 42657 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 Date: Wed, 12 Nov 2025 20:07:05 -0500 Subject: [PATCH 9/9] Exclude new example project from ABI validation --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index 926bd3ac..c2b358ae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -124,6 +124,7 @@ apiValidation { "java", "kotlin-jvm-separate-benchmark-source-set", "kotlin-jvm", + "kotlin-jvm-compare-hypothesis", "kotlin-multiplatform", "integration", )