Another round of optimization, focused on reusing arrays and small objects.
authordswitkin <dswitkin@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Sun, 2 Nov 2008 16:07:36 +0000 (16:07 +0000)
committerdswitkin <dswitkin@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Sun, 2 Nov 2008 16:07:36 +0000 (16:07 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@665 59b500cc-1b3d-0410-9834-0bbf25fbcc57

core/src/com/google/zxing/oned/AbstractUPCEANReader.java
core/src/com/google/zxing/oned/Code39Reader.java
core/src/com/google/zxing/oned/EAN13Reader.java
core/src/com/google/zxing/oned/EAN8Reader.java
core/src/com/google/zxing/oned/UPCEReader.java
core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java
core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java

index c08f299..0f31cbe 100644 (file)
@@ -84,6 +84,12 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements
     }
   }
 
+  private StringBuffer decodeRowStringBuffer;
+
+  public AbstractUPCEANReader() {
+    decodeRowStringBuffer = new StringBuffer(20);
+  }
+
   static int[] findStartGuardPattern(BitArray row) throws ReaderException {
     boolean foundStart = false;
     int[] startRange = null;
@@ -108,7 +114,8 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements
   }
 
   public final Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange) throws ReaderException {
-    StringBuffer result = new StringBuffer(20);
+    StringBuffer result = decodeRowStringBuffer;
+    result.setLength(0);
     int endStart = decodeMiddle(row, startGuardRange, result);
     int[] endRange = decodeEnd(row, endStart);
 
index 4d69d6b..4273c4f 100644 (file)
@@ -92,9 +92,7 @@ public final class Code39Reader extends AbstractOneDReader {
   public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
 
     int[] start = findAsteriskPattern(row);
-
     int nextStart = start[1];
-
     int end = row.getSize();
 
     // Read off white space
index b9ecd22..eccdc46 100644 (file)
@@ -62,9 +62,18 @@ public final class EAN13Reader extends AbstractUPCEANReader {
       0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A
   };
 
-  protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) throws ReaderException {
+  private int[] decodeMiddleCounters;
+
+  public EAN13Reader() {
+    decodeMiddleCounters = new int[4];
+  }
 
-    int[] counters = new int[4];
+  protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) throws ReaderException {
+    int[] counters = decodeMiddleCounters;
+    counters[0] = 0;
+    counters[1] = 0;
+    counters[2] = 0;
+    counters[3] = 0;
     int end = row.getSize();
     int rowOffset = startRange[1];
 
index d83c751..333eaec 100644 (file)
@@ -27,9 +27,18 @@ import com.google.zxing.common.BitArray;
  */
 public final class EAN8Reader extends AbstractUPCEANReader {
 
-  protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException {
+  private int[] decodeMiddleCounters;
+
+  public EAN8Reader() {
+    decodeMiddleCounters = new int[4];
+  }
 
-    int[] counters = new int[4];
+  protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException {
+    int[] counters = decodeMiddleCounters;
+    counters[0] = 0;
+    counters[1] = 0;
+    counters[2] = 0;
+    counters[3] = 0;
     int end = row.getSize();
     int rowOffset = startRange[1];
 
index 165f9ad..c67103d 100644 (file)
@@ -46,9 +46,18 @@ public final class UPCEReader extends AbstractUPCEANReader {
       {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A}
   };
 
-  protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException {
+  private int[] decodeMiddleCounters;
+
+  public UPCEReader() {
+    decodeMiddleCounters = new int[4];
+  }
 
-    int[] counters = new int[4];
+  protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException {
+    int[] counters = decodeMiddleCounters;
+    counters[0] = 0;
+    counters[1] = 0;
+    counters[2] = 0;
+    counters[3] = 0;
     int end = row.getSize();
     int rowOffset = startRange[1];
 
index 1f7ed3b..056fac6 100644 (file)
@@ -45,6 +45,7 @@ final class AlignmentPatternFinder {
   private final int width;\r
   private final int height;\r
   private final float moduleSize;\r
+  private final int[] crossCheckStateCount;\r
 \r
   /**\r
    * <p>Creates a finder that will look in a portion of the whole image.</p>\r
@@ -69,6 +70,7 @@ final class AlignmentPatternFinder {
     this.width = width;\r
     this.height = height;\r
     this.moduleSize = moduleSize;\r
+    this.crossCheckStateCount = new int[3];\r
   }\r
 \r
   /**\r
@@ -188,7 +190,10 @@ final class AlignmentPatternFinder {
     MonochromeBitmapSource image = this.image;\r
 \r
     int maxI = image.getHeight();\r
-    int[] stateCount = new int[3];\r
+    int[] stateCount = crossCheckStateCount;\r
+    stateCount[0] = 0;\r
+    stateCount[1] = 0;\r
+    stateCount[2] = 0;\r
 \r
     // Start counting up from center\r
     int i = startI;\r
index b9aecb0..2714eef 100755 (executable)
@@ -45,6 +45,7 @@ final class FinderPatternFinder {
   private final MonochromeBitmapSource image;\r
   private final Vector possibleCenters;\r
   private boolean hasSkipped;\r
+  private final int[] crossCheckStateCount;\r
 \r
   /**\r
    * <p>Creates a finder that will search the image for three finder patterns.</p>\r
@@ -54,6 +55,7 @@ final class FinderPatternFinder {
   FinderPatternFinder(MonochromeBitmapSource image) {\r
     this.image = image;\r
     this.possibleCenters = new Vector();\r
+    this.crossCheckStateCount = new int[5];\r
   }\r
 \r
   FinderPatternInfo find(Hashtable hints) throws ReaderException {\r
@@ -74,9 +76,10 @@ final class FinderPatternFinder {
 \r
     boolean done = false;\r
     int[] stateCount = new int[5];\r
+    BitArray blackRow = new BitArray(maxJ);\r
     for (int i = iSkip - 1; i < maxI && !done; i += iSkip) {\r
       // Get a row of black/white values\r
-      BitArray blackRow = image.getBlackRow(i, null, 0, maxJ);\r
+      blackRow = image.getBlackRow(i, blackRow, 0, maxJ);\r
       stateCount[0] = 0;\r
       stateCount[1] = 0;\r
       stateCount[2] = 0;\r
@@ -199,6 +202,15 @@ final class FinderPatternFinder {
         Math.abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance;\r
   }\r
 \r
+  private int[] getCrossCheckStateCount() {\r
+    crossCheckStateCount[0] = 0;\r
+    crossCheckStateCount[1] = 0;\r
+    crossCheckStateCount[2] = 0;\r
+    crossCheckStateCount[3] = 0;\r
+    crossCheckStateCount[4] = 0;\r
+    return crossCheckStateCount;\r
+  }\r
+\r
   /**\r
    * <p>After a horizontal scan finds a potential finder pattern, this method\r
    * "cross-checks" by scanning down vertically through the center of the possible\r
@@ -214,7 +226,7 @@ final class FinderPatternFinder {
     MonochromeBitmapSource image = this.image;\r
 \r
     int maxI = image.getHeight();\r
-    int[] stateCount = new int[5];\r
+    int[] stateCount = getCrossCheckStateCount();\r
 \r
     // Start counting up from center\r
     int i = startI;\r
@@ -284,7 +296,7 @@ final class FinderPatternFinder {
     MonochromeBitmapSource image = this.image;\r
 \r
     int maxJ = image.getWidth();\r
-    int[] stateCount = new int[5];\r
+    int[] stateCount = getCrossCheckStateCount();\r
 \r
     int j = startJ;\r
     while (j >= 0 && image.isBlack(j, centerI)) {\r