You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2023/01/16 17:49:59 UTC

[tomcat] 01/02: Refactor to avoid issues if JVM optimises conversion to ASCII

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 386051424c076577b388070d335ce7357fad681b
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Nov 14 11:38:38 2022 +0000

    Refactor to avoid issues if JVM optimises conversion to ASCII
---
 .../apache/tomcat/util/buf/TestMessageBytes.java   | 79 ++++++++++++++--------
 1 file changed, 50 insertions(+), 29 deletions(-)

diff --git a/test/org/apache/tomcat/util/buf/TestMessageBytes.java b/test/org/apache/tomcat/util/buf/TestMessageBytes.java
index f2016f478d..3311996394 100644
--- a/test/org/apache/tomcat/util/buf/TestMessageBytes.java
+++ b/test/org/apache/tomcat/util/buf/TestMessageBytes.java
@@ -16,7 +16,10 @@
  */
 package org.apache.tomcat.util.buf;
 
-import java.nio.charset.Charset;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
 import java.nio.charset.StandardCharsets;
 
 import org.junit.Assert;
@@ -24,6 +27,26 @@ import org.junit.Test;
 
 public class TestMessageBytes {
 
+    private static final String CONVERSION_STRING =
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
+            "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
+
+    private static final int CONVERSION_LOOPS = 1000000;
+
     @Test
     public void testToStringFromNull() {
         MessageBytes mb = MessageBytes.newInstance();
@@ -73,8 +96,7 @@ public class TestMessageBytes {
 
 
     /*
-     * Checks the the optimized code is at least twice as fast as the
-     * non-optimized code.
+     * Checks the the optimized code is faster than the non-optimized code.
      */
     @Test
     public void testConversionPerformance() {
@@ -87,12 +109,12 @@ public class TestMessageBytes {
          * non-optimised code. Loop three times allows once to warn up the JVM
          * once to run the test and once more in case of unexpected CI /GC
          * slowness. The test will exit early if possible.
+         *
+         * MeesageBytes only optimises conversion for ISO_8859_1
          */
         for (int i = 0; i < 3; i++) {
-            optimized = doTestConversionPerformance(StandardCharsets.ISO_8859_1);
-            // US_ASCII chosen as the conversion is the same and it is another
-            // Charset available on all platforms.
-            nonOptimized = doTestConversionPerformance(StandardCharsets.US_ASCII);
+            optimized = doTestOptimisedConversionPerformance();
+            nonOptimized = doTestConversionPerformance();
 
             System.out.println(optimized + " " + nonOptimized);
             if (optimized * 2 < nonOptimized) {
@@ -100,37 +122,36 @@ public class TestMessageBytes {
             }
         }
 
-        Assert.assertTrue("Non-optimised code was faster (" + nonOptimized + "ns) compared to optimized (" + optimized + "ns)", optimized < nonOptimized);
+        Assert.assertTrue("Non-optimised code was faster (" + nonOptimized + "ns) compared to optimized (" +
+                optimized + "ns)", optimized < nonOptimized);
     }
 
 
-    private long doTestConversionPerformance(Charset charset) {
+    private long doTestOptimisedConversionPerformance() {
         MessageBytes mb = MessageBytes.newInstance();
 
-        int loops = 1000000;
-
         long start = System.nanoTime();
-        for (int i = 0; i < loops; i++) {
+        for (int i = 0; i < CONVERSION_LOOPS; i++) {
             mb.recycle();
-            mb.setCharset(charset);
-            mb.setString("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" +
-                    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF");
+            mb.setCharset(StandardCharsets.ISO_8859_1);
+            mb.setString(CONVERSION_STRING);
             mb.toBytes();
         }
         return System.nanoTime() - start;
     }
+
+
+    private long doTestConversionPerformance() {
+        long start = System.nanoTime();
+        for (int i = 0; i < CONVERSION_LOOPS; i++) {
+            CharsetEncoder encoder = StandardCharsets.ISO_8859_1.newEncoder().onMalformedInput(
+                    CodingErrorAction.REPORT).onUnmappableCharacter(CodingErrorAction.REPORT);
+            try {
+                encoder.encode(CharBuffer.wrap(CONVERSION_STRING));
+            } catch (CharacterCodingException cce) {
+                Assert.fail();
+            }
+        }
+        return System.nanoTime() - start;
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org