Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-7197183

(str) String.substring and String.subsequence performance slower since 7u6

XMLWordPrintable

    • 7u6
    • x86
    • linux_ubuntu

      FULL PRODUCT VERSION :
      java version "1.7.0_07"
      Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
      Java HotSpot(TM) Server VM (build 23.3-b01, mixed mode)

      java version "1.7.0_06"
      Java(TM) SE Runtime Environment (build 1.7.0_06-b24)
      Java HotSpot(TM) Server VM (build 23.2-b09, mixed mode)




      ADDITIONAL OS VERSION INFORMATION :
      Linux 3.2.0-27-generic-pae #43-Ubuntu SMP Fri Jul 6 15:06:05 UTC 2012 i686 i686 i386 GNU/Linux


      EXTRA RELEVANT SYSTEM CONFIGURATION :
      Processor: Pentium(R) Dual-Core CPU E5700 @ 3.00GHz × 2
      Memory: 2 Gb

      A DESCRIPTION OF THE PROBLEM :
      The performance of the following two methods in the class "java.lang.String" is highly degraded (in JRE 7u6 and JRE 7u7). The reference for comparison is JRE 7u5.

      1) substring(...)
      2) subSequence(...)

      My testing (using the code given below) shows that these functions require 4 times the duration (under 7u7 and 7u6) required under JRE 7u5.



      REGRESSION. Last worked in version 7

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Use the test program given further below. The program should be compiled and run under Java SE 7u5, 7u6, and 7u7. The test program prints out the time consumed by the functions "String.substring(...)" and "String.subSequence(...)". The performance under 7u7 and 7u6 is highly degraded as compared to the performance under 7u5. Note the performance numbers printed in the last two lines of each run shown below:

      Running under 7u7:

      $ java -version
      java version "1.7.0_07"
      Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
      Java HotSpot(TM) Server VM (build 23.3-b01, mixed mode)
      $ java SubSeq
      subSequence: 324033
      substring: 272688

      Running under 7u6:

      $ ~/Desktop/Java-Reading/jre1.7.0_06/bin/java -version
      java version "1.7.0_06"
      Java(TM) SE Runtime Environment (build 1.7.0_06-b24)
      Java HotSpot(TM) Server VM (build 23.2-b09, mixed mode)
      $ ~/Desktop/Java-Reading/jre1.7.0_06/bin/java SubSeq
      subSequence: 291457
      substring: 282161

      Running under 7u5:

      $ ~/Desktop/Java-Reading/jre1.7.0_05/bin/java -version
      java version "1.7.0_05"
      Java(TM) SE Runtime Environment (build 1.7.0_05-b06)
      Java HotSpot(TM) Server VM (build 23.1-b03, mixed mode)
      $ ~/Desktop/Java-Reading/jre1.7.0_05/bin/java SubSeq
      subSequence: 86591
      substring: 68845






      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The performance under 7u6 and 7u7 should have been close to (or better than) that under 7u5.
      ACTUAL -
      The performance under 7u6 and 7u7 is approximately 4 times poorer than than under 7u5.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      public class SubSeq {
          public static void main(String[] args) {
              String sample =
                  "The class String includes methods for examining " +
                  "individual characters of the sequence, for comparing strings, " +
                  "for searching strings, for extracting substrings, " +
                  "and for creating a copy of a string with all " +
                  "characters translated to uppercase or to lowercase. " +
                  "Case mapping is based on the Unicode Standard " +
                  "version specified by the Character class.";
              long t0 = System.nanoTime();
              for (int i = sample.length() - 1; i >= 0; --i) {
                  sample.subSequence(i, sample.length());
              }
              long t = System.nanoTime() - t0;
              System.out.printf("subSequence: %d%n", t);
              t0 = System.nanoTime();
              for (int i = sample.length() - 1; i >= 0; --i) {
                  sample.substring(i, sample.length());
              }
              t = System.nanoTime() - t0;
              System.out.printf("substring: %d%n", t);
          }
      }

      ---------- END SOURCE ----------

            bchristi Brent Christian
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: