Author: tcurdt
Date: Sat Feb  2 13:06:04 2008
New Revision: 617895

URL: http://svn.apache.org/viewvc?rev=617895&view=rev
Log:
performance improvements submitted by [EMAIL PROTECTED]

http://issues.apache.org/bugzilla/show_bug.cgi?id=44340


Added:
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java   (with 
props)
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java   
(with props)
Modified:
    
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java
    
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldInstruction.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Instruction.java
    
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionList.java
    
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java

Modified: 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java?rev=617895&r1=617894&r2=617895&view=diff
==============================================================================
--- 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java 
(original)
+++ 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java 
Sat Feb  2 13:06:04 2008
@@ -50,8 +50,8 @@
  */
 public class ConstantPoolGen implements java.io.Serializable {
 
-    protected int size = 1024; // Inital size, sufficient in most cases
-    protected Constant[] constants = new Constant[size];
+    protected int size; 
+    protected Constant[] constants;
     protected int index = 1; // First entry (0) used by JVM
     private static final String METHODREF_DELIM = ":";
     private static final String IMETHODREF_DELIM = "#";
@@ -75,14 +75,17 @@
      * @param cs array of given constants, new ones will be appended
      */
     public ConstantPoolGen(Constant[] cs) {
-        if (cs.length > size) {
-            size = cs.length;
-            constants = new Constant[size];
-        }
+       StringBuffer sb = new StringBuffer(256);
+        
+        size = Math.max(256, cs.length + 64);
+        constants = new Constant[size];
+        
         System.arraycopy(cs, 0, constants, 0, cs.length);
         if (cs.length > 0) {
             index = cs.length;
         }
+       
+       
         for (int i = 1; i < index; i++) {
             Constant c = constants[i];
             if (c instanceof ConstantString) {
@@ -103,7 +106,13 @@
                 ConstantNameAndType n = (ConstantNameAndType) c;
                 ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()];
                 ConstantUtf8 u8_2 = (ConstantUtf8) 
constants[n.getSignatureIndex()];
-                String key = u8.getBytes() + NAT_DELIM + u8_2.getBytes();
+                
+                sb.append(u8.getBytes());
+                sb.append(NAT_DELIM);
+                sb.append(u8_2.getBytes());
+                String key = sb.toString();
+                sb.delete(0, sb.length());
+                
                 if (!n_a_t_table.containsKey(key)) {
                     n_a_t_table.put(key, new Index(i));
                 }
@@ -129,7 +138,15 @@
                 } else if (c instanceof ConstantFieldref) {
                     delim = FIELDREF_DELIM;
                 }
-                String key = class_name + delim + method_name + delim + 
signature;
+                
+                sb.append(class_name);
+                sb.append(delim);
+                sb.append(method_name);
+                sb.append(delim);
+                sb.append(signature);
+                String key = sb.toString();
+                sb.delete(0, sb.length());
+                
                 if (!cp_table.containsKey(key)) {
                     cp_table.put(key, new Index(i));
                 }
@@ -150,6 +167,8 @@
      * Create empty constant pool.
      */
     public ConstantPoolGen() {
+       size = 256;
+        constants = new Constant[size];
     }
 
 

Modified: 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldInstruction.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldInstruction.java?rev=617895&r1=617894&r2=617895&view=diff
==============================================================================
--- 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldInstruction.java 
(original)
+++ 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldInstruction.java 
Sat Feb  2 13:06:04 2008
@@ -54,7 +54,7 @@
     /** @return size of field (1 or 2)
      */
     protected int getFieldSize( ConstantPoolGen cpg ) {
-        return getType(cpg).getSize();
+       return Type.getTypeSize(getSignature(cpg));
     }
 
 

Modified: 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Instruction.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Instruction.java?rev=617895&r1=617894&r2=617895&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Instruction.java 
(original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Instruction.java 
Sat Feb  2 13:06:04 2008
@@ -153,53 +153,309 @@
         if (InstructionConstants.INSTRUCTIONS[opcode] != null) {
             return InstructionConstants.INSTRUCTIONS[opcode]; // Used 
predefined immutable object, if available
         }
-        /* Find appropiate class, instantiate an (empty) instruction object
-         * and initialize it by hand.
-         */
-        Class clazz;
-        try {
-            clazz = Class.forName(className(opcode));
-        } catch (ClassNotFoundException cnfe) {
-            // If a class by that name does not exist, the opcode is illegal.
-            // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a 
sense.
-            throw new ClassGenException("Illegal opcode detected.");
-        }
-        try {
-            obj = (Instruction) clazz.newInstance();
-            if (wide
-                    && !((obj instanceof LocalVariableInstruction) || (obj 
instanceof IINC) || (obj instanceof RET))) {
-                throw new Exception("Illegal opcode after wide: " + opcode);
-            }
-            obj.setOpcode(opcode);
-            obj.initFromFile(bytes, wide); // Do further initializations, if 
any
-            // Byte code offset set in InstructionList
-        } catch (Exception e) {
-            throw new ClassGenException(e.toString());
-        }
-        return obj;
-    }
-
-
-    private static final String className( short opcode ) {
-        String name = 
Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH);
-        /* ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 
and the like
-         * are not implemented (directly).
-         */
-        try {
-            int len = name.length();
-            char ch1 = name.charAt(len - 2), ch2 = name.charAt(len - 1);
-            if ((ch1 == '_') && (ch2 >= '0') && (ch2 <= '5')) {
-                name = name.substring(0, len - 2);
-            }
-            if (name.equals("ICONST_M1")) {
-                name = "ICONST";
-            }
-        } catch (StringIndexOutOfBoundsException e) {
-            System.err.println(e);
-        }
-        return "org.apache.bcel.generic." + name;
-    }
+        
+        switch (opcode) {
+                       case Constants.BIPUSH:
+                               obj = new BIPUSH();
+                               break;
+                       case Constants.SIPUSH:
+                               obj = new SIPUSH();
+                               break;
+                       case Constants.LDC:
+                               obj = new LDC();
+                               break;
+                       case Constants.LDC_W:
+                               obj = new LDC_W();
+                               break;
+                       case Constants.LDC2_W:
+                               obj = new LDC2_W();
+                               break;
+                       case Constants.ILOAD:
+                               obj = new ILOAD();
+                               break;
+                       case Constants.LLOAD:
+                               obj = new LLOAD();
+                               break;
+                       case Constants.FLOAD:
+                               obj = new FLOAD();
+                               break;
+                       case Constants.DLOAD:
+                               obj = new DLOAD();
+                               break;
+                       case Constants.ALOAD:
+                               obj = new ALOAD();
+                               break;
+                       case Constants.ILOAD_0:
+                               obj = new ILOAD(0);
+                               break;
+                       case Constants.ILOAD_1:
+                               obj = new ILOAD(1);
+                               break;
+                       case Constants.ILOAD_2:
+                               obj = new ILOAD(2);
+                               break;
+                       case Constants.ILOAD_3:
+                               obj = new ILOAD(3);
+                               break;
+                       case Constants.LLOAD_0:
+                               obj = new LLOAD(0);
+                               break;
+                       case Constants.LLOAD_1:
+                               obj = new LLOAD(1);
+                               break;
+                       case Constants.LLOAD_2:
+                               obj = new LLOAD(2);
+                               break;
+                       case Constants.LLOAD_3:
+                               obj = new LLOAD(3);
+                               break;
+                       case Constants.FLOAD_0:
+                               obj = new FLOAD(0);
+                               break;
+                       case Constants.FLOAD_1:
+                               obj = new FLOAD(1);
+                               break;
+                       case Constants.FLOAD_2:
+                               obj = new FLOAD(2);
+                               break;
+                       case Constants.FLOAD_3:
+                               obj = new FLOAD(3);
+                               break;
+                       case Constants.DLOAD_0:
+                               obj = new DLOAD(0);
+                               break;
+                       case Constants.DLOAD_1:
+                               obj = new DLOAD(1);
+                               break;
+                       case Constants.DLOAD_2:
+                               obj = new DLOAD(2);
+                               break;
+                       case Constants.DLOAD_3:
+                               obj = new DLOAD(3);
+                               break;
+                       case Constants.ALOAD_0:
+                               obj = new ALOAD(0);
+                               break;
+                       case Constants.ALOAD_1:
+                               obj = new ALOAD(1);
+                               break;
+                       case Constants.ALOAD_2:
+                               obj = new ALOAD(2);
+                               break;
+                       case Constants.ALOAD_3:
+                               obj = new ALOAD(3);
+                               break;
+                       case Constants.ISTORE:
+                               obj = new ISTORE();
+                               break;
+                       case Constants.LSTORE:
+                               obj = new LSTORE();
+                               break;
+                       case Constants.FSTORE:
+                               obj = new FSTORE();
+                               break;
+                       case Constants.DSTORE:
+                               obj = new DSTORE();
+                               break;
+                       case Constants.ASTORE:
+                               obj = new ASTORE();
+                               break;
+                       case Constants.ISTORE_0:
+                               obj = new ISTORE(0);
+                               break;
+                       case Constants.ISTORE_1:
+                               obj = new ISTORE(1);
+                               break;
+                       case Constants.ISTORE_2:
+                               obj = new ISTORE(2);
+                               break;
+                       case Constants.ISTORE_3:
+                               obj = new ISTORE(3);
+                               break;
+                       case Constants.LSTORE_0:
+                               obj = new LSTORE(0);
+                               break;
+                       case Constants.LSTORE_1:
+                               obj = new LSTORE(1);
+                               break;
+                       case Constants.LSTORE_2:
+                               obj = new LSTORE(2);
+                               break;
+                       case Constants.LSTORE_3:
+                               obj = new LSTORE(3);
+                               break;
+                       case Constants.FSTORE_0:
+                               obj = new FSTORE(0);
+                               break;
+                       case Constants.FSTORE_1:
+                               obj = new FSTORE(1);
+                               break;
+                       case Constants.FSTORE_2:
+                               obj = new FSTORE(2);
+                               break;
+                       case Constants.FSTORE_3:
+                               obj = new FSTORE(3);
+                               break;
+                       case Constants.DSTORE_0:
+                               obj = new DSTORE(0);
+                               break;
+                       case Constants.DSTORE_1:
+                               obj = new DSTORE(1);
+                               break;
+                       case Constants.DSTORE_2:
+                               obj = new DSTORE(2);
+                               break;
+                       case Constants.DSTORE_3:
+                               obj = new DSTORE(3);
+                               break;
+                       case Constants.ASTORE_0:
+                               obj = new ASTORE(0);
+                               break;
+                       case Constants.ASTORE_1:
+                               obj = new ASTORE(1);
+                               break;
+                       case Constants.ASTORE_2:
+                               obj = new ASTORE(2);
+                               break;
+                       case Constants.ASTORE_3:
+                               obj = new ASTORE(3);
+                               break;
+                       case Constants.IINC:
+                               obj = new IINC();
+                               break;
+                       case Constants.IFEQ:
+                               obj = new IFEQ();
+                               break;
+                       case Constants.IFNE:
+                               obj = new IFNE();
+                               break;
+                       case Constants.IFLT:
+                               obj = new IFLT();
+                               break;
+                       case Constants.IFGE:
+                               obj = new IFGE();
+                               break;
+                       case Constants.IFGT:
+                               obj = new IFGT();
+                               break;
+                       case Constants.IFLE:
+                               obj = new IFLE();
+                               break;
+                       case Constants.IF_ICMPEQ:
+                               obj = new IF_ICMPEQ();
+                               break;
+                       case Constants.IF_ICMPNE:
+                               obj = new IF_ICMPNE();
+                               break;
+                       case Constants.IF_ICMPLT:
+                               obj = new IF_ICMPLT();
+                               break;
+                       case Constants.IF_ICMPGE:
+                               obj = new IF_ICMPGE();
+                               break;
+                       case Constants.IF_ICMPGT:
+                               obj = new IF_ICMPGT();
+                               break;
+                       case Constants.IF_ICMPLE:
+                               obj = new IF_ICMPLE();
+                               break;
+                       case Constants.IF_ACMPEQ:
+                               obj = new IF_ACMPEQ();
+                               break;
+                       case Constants.IF_ACMPNE:
+                               obj = new IF_ACMPNE();
+                               break;
+                       case Constants.GOTO:
+                               obj = new GOTO();
+                               break;
+                       case Constants.JSR:
+                               obj = new JSR();
+                               break;
+                       case Constants.RET:
+                               obj = new RET();
+                               break;
+                       case Constants.TABLESWITCH:
+                               obj = new TABLESWITCH();
+                               break;
+                       case Constants.LOOKUPSWITCH:
+                               obj = new LOOKUPSWITCH();
+                               break;
+                       case Constants.GETSTATIC:
+                               obj = new GETSTATIC();
+                               break;
+                       case Constants.PUTSTATIC:
+                               obj = new PUTSTATIC();
+                               break;
+                       case Constants.GETFIELD:
+                               obj = new GETFIELD();
+                               break;
+                       case Constants.PUTFIELD:
+                               obj = new PUTFIELD();
+                               break;
+                       case Constants.INVOKEVIRTUAL:
+                               obj = new INVOKEVIRTUAL();
+                               break;
+                       case Constants.INVOKESPECIAL:
+                               obj = new INVOKESPECIAL();
+                               break;
+                       case Constants.INVOKESTATIC:
+                               obj = new INVOKESTATIC();
+                               break;
+                       case Constants.INVOKEINTERFACE:
+                               obj = new INVOKEINTERFACE();
+                               break;
+                       case Constants.NEW:
+                               obj = new NEW();
+                               break;
+                       case Constants.NEWARRAY:
+                               obj = new NEWARRAY();
+                               break;
+                       case Constants.ANEWARRAY:
+                               obj = new ANEWARRAY();
+                               break;
+                       case Constants.CHECKCAST:
+                               obj = new CHECKCAST();
+                               break;
+                       case Constants.INSTANCEOF:
+                               obj = new INSTANCEOF();
+                               break;
+                       case Constants.MULTIANEWARRAY:
+                               obj = new MULTIANEWARRAY();
+                               break;
+                       case Constants.IFNULL:
+                               obj = new IFNULL();
+                               break;
+                       case Constants.IFNONNULL:
+                               obj = new IFNONNULL();
+                               break;
+                       case Constants.GOTO_W:
+                               obj = new GOTO_W();
+                               break;
+                       case Constants.JSR_W:
+                               obj = new JSR_W();
+                               break;
+                       case Constants.BREAKPOINT:
+                               obj = new BREAKPOINT();
+                               break;
+                       case Constants.IMPDEP1:
+                               obj = new IMPDEP1();
+                               break;
+                       case Constants.IMPDEP2:
+                               obj = new IMPDEP2();
+                               break;
+                       default:
+                               throw new ClassGenException("Illegal opcode 
detected.");
 
+               }
+        
+        if (wide
+                               && !((obj instanceof LocalVariableInstruction) 
|| (obj instanceof IINC) || (obj instanceof RET))) {
+                       throw new ClassGenException("Illegal opcode after wide: 
" + opcode);
+               }
+               obj.setOpcode(opcode);
+               obj.initFromFile(bytes, wide); // Do further initializations, 
if any
+               return obj;
+       }
 
     /**
      * This method also gives right results for instructions whose

Modified: 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionList.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionList.java?rev=617895&r1=617894&r2=617895&view=diff
==============================================================================
--- 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionList.java 
(original)
+++ 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionList.java 
Sat Feb  2 13:06:04 2008
@@ -140,8 +140,15 @@
      * @return target position's instruction handle if available
      */
     public InstructionHandle findHandle( int pos ) {
-        InstructionHandle[] ihs = getInstructionHandles();
-        return findHandle(ihs, byte_positions, length, pos);
+       int[] positions = byte_positions;
+        InstructionHandle ih = start;
+        for (int i = 0; i < length; i++) { 
+            if(positions[i] == pos) {
+                return ih;
+            }
+            ih = ih.next;
+        }
+        return null;
     }
 
 

Modified: 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java?rev=617895&r1=617894&r2=617895&view=diff
==============================================================================
--- 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java 
(original)
+++ 
jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java 
Sat Feb  2 13:06:04 2008
@@ -63,18 +63,15 @@
      * @return Number of words consumed from stack by this instruction
      */
     public int consumeStack( ConstantPoolGen cpg ) {
-        String signature = getSignature(cpg);
-        Type[] args = Type.getArgumentTypes(signature);
         int sum;
         if (opcode == Constants.INVOKESTATIC) {
             sum = 0;
         } else {
             sum = 1; // this reference
         }
-        int n = args.length;
-        for (int i = 0; i < n; i++) {
-            sum += args[i].getSize();
-        }
+        
+        String signature = getSignature(cpg);
+        sum += Type.getArgumentTypesSize(signature);
         return sum;
     }
 
@@ -85,7 +82,8 @@
      * @return Number of words produced onto stack by this instruction
      */
     public int produceStack( ConstantPoolGen cpg ) {
-        return getReturnType(cpg).getSize();
+       String signature = getSignature(cpg);
+       return Type.getReturnTypeSize(signature);
     }
 
 

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java?rev=617895&r1=617894&r2=617895&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java 
(original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java Sat Feb  
2 13:06:04 2008
@@ -307,4 +307,63 @@
         sb.append(getType(meth.getReturnType()).getSignature());
         return sb.toString();
     }
+    
+    private static int size(int coded) {
+       return coded & 3;
+    }
+    
+    private static int consumed(int coded) {
+       return coded >> 2;
+    }
+    
+    private static int encode(int size, int consumed) {
+       return consumed << 2 | size;
+    }
+    
+    static int getArgumentTypesSize( String signature ) {
+        int res = 0;
+        int index;
+        Type[] types;
+        try { // Read all declarations between for `(' and `)'
+            if (signature.charAt(0) != '(') {
+                throw new ClassFormatException("Invalid method signature: " + 
signature);
+            }
+            index = 1; // current string position
+            while (signature.charAt(index) != ')') {
+                int coded = getTypeSize(signature.substring(index));
+                res += size(coded);
+                index += consumed(coded);
+            }
+        } catch (StringIndexOutOfBoundsException e) { // Should never occur
+            throw new ClassFormatException("Invalid method signature: " + 
signature);
+        }
+        return res;
+    }
+    
+    static final int getTypeSize( String signature ) throws 
StringIndexOutOfBoundsException {
+        byte type = Utility.typeOfSignature(signature);
+        if (type <= Constants.T_VOID) {
+            return encode(BasicType.getType(type).getSize(), 1);
+        } else if (type == Constants.T_ARRAY) {
+            int dim = 0;
+            do { // Count dimensions
+                dim++;
+            } while (signature.charAt(dim) == '[');
+            // Recurse, but just once, if the signature is ok
+            int consumed = consumed(getTypeSize(signature.substring(dim)));
+            return encode(1, dim + consumed);
+        } else { // type == T_REFERENCE
+            int index = signature.indexOf(';'); // Look for closing `;'
+            if (index < 0) {
+                throw new ClassFormatException("Invalid signature: " + 
signature);
+            }
+            return encode(1, index + 1);
+        }
+    }
+
+
+       static int getReturnTypeSize(String signature) {
+               int index = signature.lastIndexOf(')') + 1;
+        return getTypeSize(signature.substring(index));
+       }
 }

Added: jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java?rev=617895&view=auto
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java (added)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java Sat Feb  2 
13:06:04 2008
@@ -0,0 +1,49 @@
+/*
+ * Copyright  2000-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License"); 
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License. 
+ *
+ */
+package org.apache.bcel;
+
+public class NanoTimer {
+
+       private long time = 0;
+
+       public NanoTimer start() {
+               time -= System.nanoTime();
+               return this;
+       }
+
+       public void stop() {
+               time += System.nanoTime();
+       }
+
+       public void subtract(NanoTimer o) {
+               time -= o.time;
+       }
+
+       public void reset() {
+               time = 0;
+       }
+
+       /**
+        * May ony be called after stop has been called as many times as start.
+        */
+       public String toString() {
+               return ((double) (time) / 1000000000) + " s";
+       }
+
+
+
+}

Propchange: jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: jakarta/bcel/trunk/src/test/java/org/apache/bcel/NanoTimer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java?rev=617895&view=auto
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java 
(added)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java Sat 
Feb  2 13:06:04 2008
@@ -0,0 +1,136 @@
+/*
+ * Copyright  2000-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License"); 
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License. 
+ *
+ */
+package org.apache.bcel;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import junit.framework.TestCase;
+
+import org.apache.bcel.classfile.ClassParser;
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.bcel.classfile.Method;
+import org.apache.bcel.generic.ClassGen;
+import org.apache.bcel.generic.InstructionList;
+import org.apache.bcel.generic.MethodGen;
+
+public final class PerformanceTest extends TestCase {
+
+       private static byte[] read(final InputStream is) throws IOException {
+               if (is == null) {
+                       throw new IOException("Class not found");
+               }
+               byte[] b = new byte[is.available()];
+               int len = 0;
+               while (true) {
+                       int n = is.read(b, len, b.length - len);
+                       if (n == -1) {
+                               if (len < b.length) {
+                                       byte[] c = new byte[len];
+                                       System.arraycopy(b, 0, c, 0, len);
+                                       b = c;
+                               }
+                               return b;
+                       }
+                       len += n;
+                       if (len == b.length) {
+                               byte[] c = new byte[b.length + 1000];
+                               System.arraycopy(b, 0, c, 0, len);
+                               b = c;
+                       }
+               }
+       }
+       
+       private static void test(int fraction) throws IOException {
+               NanoTimer total = new NanoTimer();
+               NanoTimer parseTime = new NanoTimer();
+               NanoTimer cgenTime = new NanoTimer();
+               NanoTimer mgenTime = new NanoTimer();
+               NanoTimer mserTime = new NanoTimer();
+               NanoTimer serTime = new NanoTimer();
+
+               total.start();
+
+               String javaHome = System.getProperty("java.home");
+
+        JarFile jar = new JarFile(javaHome + "/lib/dt.jar");
+               Enumeration en = jar.entries();
+               int i = 0;
+
+               while (en.hasMoreElements()) {
+                       JarEntry e = (JarEntry) en.nextElement();
+                       if (e.getName().endsWith(".class") && i++ % fraction == 
0) {
+                               InputStream in = jar.getInputStream(e);
+                               byte[] bytes = read(in);
+
+                               parseTime.start();
+                               JavaClass clazz = new ClassParser(new 
ByteArrayInputStream(bytes), e.getName())
+                                               .parse();
+                               parseTime.stop();
+
+                               cgenTime.start();
+                               ClassGen cg = new ClassGen(clazz);
+                               cgenTime.stop();
+
+                               Method[] methods = cg.getMethods();
+                               for (int j = 0; j < methods.length; j++) {
+                                       Method m = methods[j];
+
+                                       mgenTime.start();
+                                       MethodGen mg = new MethodGen(m, 
cg.getClassName(), cg.getConstantPool());
+                                       InstructionList il = 
mg.getInstructionList();
+                                       mgenTime.stop();
+
+                                       mserTime.start();
+                                       if (il != null) {
+                                               
mg.getInstructionList().setPositions();
+                                               mg.setMaxLocals();
+                                               mg.setMaxStack();
+                                       }
+                                       cg.replaceMethod(m, mg.getMethod());
+                                       mserTime.stop();
+                               }
+
+                               serTime.start();
+                               cg.getJavaClass().getBytes();
+                               serTime.stop();
+                       }
+               }
+
+               total.stop();
+               System.out.println("ClassParser.parse: " + parseTime);
+               System.out.println("ClassGen.init: " + cgenTime);
+               System.out.println("MethodGen.init: " + mgenTime);
+               System.out.println("MethodGen.getMethod: " + mserTime);
+               System.out.println("ClassGen.getJavaClass.getBytes: " + 
serTime);
+               System.out.println("Total: " + total);
+               System.out.println();
+       }
+
+       public void testPerformance() throws IOException {
+               test(1);
+               test(1);
+               test(1);                
+       }
+       
+}

Propchange: 
jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: 
jakarta/bcel/trunk/src/test/java/org/apache/bcel/PerformanceTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to