Support underscores in param values
Roman Leventov
leventov.ru at gmail.com
Tue May 21 13:38:09 UTC 2019
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