Support underscores in param values
Roman Leventov
leventov.ru at gmail.com
Fri Jun 7 17:31:19 UTC 2019
Could any of the committers please review this patch?
On Tue, 21 May 2019 at 17:52, Roman Leventov <leventov.ru at gmail.com> wrote:
> Small fix: a comment in NumericParams should say "Such replacement doesn't
> guarantee strict compliancy with JLS", not "JDK".
>
> On Tue, 21 May 2019 at 15:38, Roman Leventov <leventov.ru at gmail.com>
> wrote:
>
>> The following patch adds support for underscores in param values:
>>
>> @Param("100_000")
>> public int n;
>>
>> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
>> +++
>> b/jmh-core-ct/src/test/java/org/openjdk/jmh/ct/params/ParamUnderscoresTest.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -0,0 +1,65 @@
>> +/*
>> + * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>> + *
>> + * This code is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License version 2 only, as
>> + * published by the Free Software Foundation. Oracle designates this
>> + * particular file as subject to the "Classpath" exception as provided
>> + * by Oracle in the LICENSE file that accompanied this code.
>> + *
>> + * This code is distributed in the hope that it will be useful, but
>> WITHOUT
>> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>> + * version 2 for more details (a copy is included in the LICENSE file
>> that
>> + * accompanied this code).
>> + *
>> + * You should have received a copy of the GNU General Public License
>> version
>> + * 2 along with this work; if not, write to the Free Software Foundation,
>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>> + *
>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065
>> USA
>> + * or visit www.oracle.com if you need additional information or have
>> any
>> + * questions.
>> + */
>> +package org.openjdk.jmh.ct.params;
>> +
>> +import org.junit.Test;
>> +import org.openjdk.jmh.annotations.Benchmark;
>> +import org.openjdk.jmh.annotations.Param;
>> +import org.openjdk.jmh.annotations.Scope;
>> +import org.openjdk.jmh.annotations.State;
>> +import org.openjdk.jmh.ct.CompileTest;
>> +
>> + at State(Scope.Benchmark)
>> +public class ParamUnderscoresTest {
>> +
>> + @Param("1_00")
>> + public byte byteParam;
>> +
>> + @Param("10_000")
>> + public short shortParam;
>> +
>> + @Param("100_000")
>> + public int intParam;
>> +
>> + @Param("0.999_999")
>> + public float floatParam;
>> +
>> + @Param("100_000")
>> + public long longParam;
>> +
>> + @Param("0.999_999")
>> + public double doubleParam;
>> +
>> + @Benchmark
>> + public void test() {
>> +
>> + }
>> +
>> + @Test
>> + public void compileTest() {
>> + CompileTest.assertOK(this.getClass());
>> + }
>> +
>> +}
>> diff -r 99d7b73cf1e3 -r 3ceecc6774f4
>> jmh-core-ct/src/test/java/org/openjdk/jmh/ct/params/invalid/Int4Test.java
>> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
>> +++
>> b/jmh-core-ct/src/test/java/org/openjdk/jmh/ct/params/invalid/Int4Test.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -0,0 +1,50 @@
>> +/*
>> + * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>> + *
>> + * This code is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License version 2 only, as
>> + * published by the Free Software Foundation. Oracle designates this
>> + * particular file as subject to the "Classpath" exception as provided
>> + * by Oracle in the LICENSE file that accompanied this code.
>> + *
>> + * This code is distributed in the hope that it will be useful, but
>> WITHOUT
>> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>> + * version 2 for more details (a copy is included in the LICENSE file
>> that
>> + * accompanied this code).
>> + *
>> + * You should have received a copy of the GNU General Public License
>> version
>> + * 2 along with this work; if not, write to the Free Software Foundation,
>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>> + *
>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065
>> USA
>> + * or visit www.oracle.com if you need additional information or have
>> any
>> + * questions.
>> + */
>> +package org.openjdk.jmh.ct.params.invalid;
>> +
>> +import org.junit.Test;
>> +import org.openjdk.jmh.annotations.Benchmark;
>> +import org.openjdk.jmh.annotations.Param;
>> +import org.openjdk.jmh.annotations.Scope;
>> +import org.openjdk.jmh.annotations.State;
>> +import org.openjdk.jmh.ct.CompileTest;
>> +
>> + at State(Scope.Benchmark)
>> +public class Int4Test {
>> +
>> + @Param("_1")
>> + public int param;
>> +
>> + @Benchmark
>> + public void test() {
>> +
>> + }
>> +
>> + @Test
>> + public void compileTest() {
>> + CompileTest.assertFail(this.getClass());
>> + }
>> +
>> +}
>> diff -r 99d7b73cf1e3 -r 3ceecc6774f4
>> jmh-core-ct/src/test/java/org/openjdk/jmh/ct/params/invalid/Int5Test.java
>> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
>> +++
>> b/jmh-core-ct/src/test/java/org/openjdk/jmh/ct/params/invalid/Int5Test.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -0,0 +1,50 @@
>> +/*
>> + * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>> + *
>> + * This code is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License version 2 only, as
>> + * published by the Free Software Foundation. Oracle designates this
>> + * particular file as subject to the "Classpath" exception as provided
>> + * by Oracle in the LICENSE file that accompanied this code.
>> + *
>> + * This code is distributed in the hope that it will be useful, but
>> WITHOUT
>> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>> + * version 2 for more details (a copy is included in the LICENSE file
>> that
>> + * accompanied this code).
>> + *
>> + * You should have received a copy of the GNU General Public License
>> version
>> + * 2 along with this work; if not, write to the Free Software Foundation,
>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>> + *
>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065
>> USA
>> + * or visit www.oracle.com if you need additional information or have
>> any
>> + * questions.
>> + */
>> +package org.openjdk.jmh.ct.params.invalid;
>> +
>> +import org.junit.Test;
>> +import org.openjdk.jmh.annotations.Benchmark;
>> +import org.openjdk.jmh.annotations.Param;
>> +import org.openjdk.jmh.annotations.Scope;
>> +import org.openjdk.jmh.annotations.State;
>> +import org.openjdk.jmh.ct.CompileTest;
>> +
>> + at State(Scope.Benchmark)
>> +public class Int5Test {
>> +
>> + @Param("1_")
>> + public int param;
>> +
>> + @Benchmark
>> + public void test() {
>> +
>> + }
>> +
>> + @Test
>> + public void compileTest() {
>> + CompileTest.assertFail(this.getClass());
>> + }
>> +
>> +}
>> diff -r 99d7b73cf1e3 -r 3ceecc6774f4
>> jmh-core/src/main/java/org/openjdk/jmh/generators/core/NumericParams.java
>> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
>> +++
>> b/jmh-core/src/main/java/org/openjdk/jmh/generators/core/NumericParams.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -0,0 +1,46 @@
>> +/*
>> + * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>> + *
>> + * This code is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License version 2 only, as
>> + * published by the Free Software Foundation. Oracle designates this
>> + * particular file as subject to the "Classpath" exception as provided
>> + * by Oracle in the LICENSE file that accompanied this code.
>> + *
>> + * This code is distributed in the hope that it will be useful, but
>> WITHOUT
>> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>> + * version 2 for more details (a copy is included in the LICENSE file
>> that
>> + * accompanied this code).
>> + *
>> + * You should have received a copy of the GNU General Public License
>> version
>> + * 2 along with this work; if not, write to the Free Software Foundation,
>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>> + *
>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065
>> USA
>> + * or visit www.oracle.com if you need additional information or have
>> any
>> + * questions.
>> + */
>> +package org.openjdk.jmh.generators.core;
>> +
>> +import java.util.regex.Pattern;
>> +
>> +public final class NumericParams {
>> +
>> + private static final Pattern UNDERSCORE_BETWEEN_DIGITS =
>> + Pattern.compile("(?<=[0-9])_(?=[0-9])");
>> +
>> + /**
>> + * This method needs to be public because accesses are generated in
>> {@link
>> + * StateObject#getParamAccessor}.
>> + */
>> + public static String removeJava7LiteralUnderscores(String
>> numericLiteral) {
>> + // Such replacement doesn't guarantee strict compliancy with
>> JDK, but in practice it's just
>> + // fine to allow underscores in numeric values for parameters.
>> + return
>> UNDERSCORE_BETWEEN_DIGITS.matcher(numericLiteral).replaceAll("");
>> + }
>> +
>> +
>> + private NumericParams() {}
>> +}
>> diff -r 99d7b73cf1e3 -r 3ceecc6774f4
>> jmh-core/src/main/java/org/openjdk/jmh/generators/core/StateObject.java
>> ---
>> a/jmh-core/src/main/java/org/openjdk/jmh/generators/core/StateObject.java Fri
>> May 17 10:44:26 2019 -0700
>> +++
>> b/jmh-core/src/main/java/org/openjdk/jmh/generators/core/StateObject.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -117,29 +117,31 @@
>> if (type.equalsIgnoreCase("java.lang.String")) {
>> return "control.getParam(\"" + name + "\")";
>> }
>> + String removeUnderscores =
>> + NumericParams.class.getName() +
>> ".removeJava7LiteralUnderscores(";
>> if (type.equalsIgnoreCase("boolean") ||
>> type.equalsIgnoreCase("java.lang.Boolean")) {
>> return "Boolean.valueOf(control.getParam(\"" + name + "\"))";
>> }
>> if (type.equalsIgnoreCase("byte") ||
>> type.equalsIgnoreCase("java.lang.Byte")) {
>> - return "Byte.valueOf(control.getParam(\"" + name + "\"))";
>> + return "Byte.valueOf(" + removeUnderscores +
>> "control.getParam(\"" + name + "\")))";
>> }
>> if (type.equalsIgnoreCase("char") ||
>> type.equalsIgnoreCase("java.lang.Character")) {
>> return "(control.getParam(\"" + name + "\")).charAt(0)";
>> }
>> if (type.equalsIgnoreCase("short") ||
>> type.equalsIgnoreCase("java.lang.Short")) {
>> - return "Short.valueOf(control.getParam(\"" + name + "\"))";
>> + return "Short.valueOf(" + removeUnderscores +
>> "control.getParam(\"" + name + "\")))";
>> }
>> if (type.equalsIgnoreCase("int") ||
>> type.equalsIgnoreCase("java.lang.Integer")) {
>> - return "Integer.valueOf(control.getParam(\"" + name + "\"))";
>> + return "Integer.valueOf(" + removeUnderscores +
>> "control.getParam(\"" + name + "\")))";
>> }
>> if (type.equalsIgnoreCase("float") ||
>> type.equalsIgnoreCase("java.lang.Float")) {
>> - return "Float.valueOf(control.getParam(\"" + name + "\"))";
>> + return "Float.valueOf(" + removeUnderscores +
>> "control.getParam(\"" + name + "\")))";
>> }
>> if (type.equalsIgnoreCase("long") ||
>> type.equalsIgnoreCase("java.lang.Long")) {
>> - return "Long.valueOf(control.getParam(\"" + name + "\"))";
>> + return "Long.valueOf(" + removeUnderscores +
>> "control.getParam(\"" + name + "\")))";
>> }
>> if (type.equalsIgnoreCase("double") ||
>> type.equalsIgnoreCase("java.lang.Double")) {
>> - return "Double.valueOf(control.getParam(\"" + name + "\"))";
>> + return "Double.valueOf(" + removeUnderscores +
>> "control.getParam(\"" + name + "\")))";
>> }
>>
>> // assume enum
>> diff -r 99d7b73cf1e3 -r 3ceecc6774f4
>> jmh-core/src/main/java/org/openjdk/jmh/generators/core/StateObjectHandler.java
>> ---
>> a/jmh-core/src/main/java/org/openjdk/jmh/generators/core/StateObjectHandler.java Fri
>> May 17 10:44:26 2019 -0700
>> +++
>> b/jmh-core/src/main/java/org/openjdk/jmh/generators/core/StateObjectHandler.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -441,7 +441,7 @@
>> }
>> if (typeName.equals("byte") ||
>> typeName.equals("java.lang.Byte")) {
>> try {
>> - Byte.valueOf(val);
>> +
>> Byte.valueOf(NumericParams.removeJava7LiteralUnderscores(val));
>> return true;
>> } catch (NumberFormatException nfe) {
>> }
>> @@ -451,35 +451,35 @@
>> }
>> if (typeName.equals("short") ||
>> typeName.equals("java.lang.Short")) {
>> try {
>> - Short.valueOf(val);
>> +
>> Short.valueOf(NumericParams.removeJava7LiteralUnderscores(val));
>> return true;
>> } catch (NumberFormatException nfe) {
>> }
>> }
>> if (typeName.equals("int") ||
>> typeName.equals("java.lang.Integer")) {
>> try {
>> - Integer.valueOf(val);
>> +
>> Integer.valueOf(NumericParams.removeJava7LiteralUnderscores(val));
>> return true;
>> } catch (NumberFormatException nfe) {
>> }
>> }
>> if (typeName.equals("float") ||
>> typeName.equals("java.lang.Float")) {
>> try {
>> - Float.valueOf(val);
>> +
>> Float.valueOf(NumericParams.removeJava7LiteralUnderscores(val));
>> return true;
>> } catch (NumberFormatException nfe) {
>> }
>> }
>> if (typeName.equals("long") ||
>> typeName.equals("java.lang.Long")) {
>> try {
>> - Long.valueOf(val);
>> +
>> Long.valueOf(NumericParams.removeJava7LiteralUnderscores(val));
>> return true;
>> } catch (NumberFormatException nfe) {
>> }
>> }
>> if (typeName.equals("double") ||
>> typeName.equals("java.lang.Double")) {
>> try {
>> - Double.valueOf(val);
>> +
>> Double.valueOf(NumericParams.removeJava7LiteralUnderscores(val));
>> return true;
>> } catch (NumberFormatException nfe) {
>> }
>> diff -r 99d7b73cf1e3 -r 3ceecc6774f4
>> jmh-core/src/test/java/org/openjdk/jmh/generators/core/NumericParamsTest.java
>> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
>> +++
>> b/jmh-core/src/test/java/org/openjdk/jmh/generators/core/NumericParamsTest.java Tue
>> May 21 15:32:05 2019 +0200
>> @@ -0,0 +1,38 @@
>> +/*
>> + * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>> + *
>> + * This code is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License version 2 only, as
>> + * published by the Free Software Foundation. Oracle designates this
>> + * particular file as subject to the "Classpath" exception as provided
>> + * by Oracle in the LICENSE file that accompanied this code.
>> + *
>> + * This code is distributed in the hope that it will be useful, but
>> WITHOUT
>> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>> + * version 2 for more details (a copy is included in the LICENSE file
>> that
>> + * accompanied this code).
>> + *
>> + * You should have received a copy of the GNU General Public License
>> version
>> + * 2 along with this work; if not, write to the Free Software Foundation,
>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>> + *
>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065
>> USA
>> + * or visit www.oracle.com if you need additional information or have
>> any
>> + * questions.
>> + */
>> +package org.openjdk.jmh.generators.core;
>> +
>> +import org.junit.Assert;
>> +import org.junit.Test;
>> +
>> +public class NumericParamsTest {
>> +
>> + @Test
>> + public void testRemoveJava7LiteralUnderscores() {
>> + Assert.assertEquals("10",
>> NumericParams.removeJava7LiteralUnderscores("1_0"));
>> + Assert.assertEquals("0.99",
>> NumericParams.removeJava7LiteralUnderscores("0.9_9"));
>> + Assert.assertEquals("10.0",
>> NumericParams.removeJava7LiteralUnderscores("1_0.0"));
>> + }
>> +}
>>
>
More information about the jmh-dev
mailing list