Browse Source

performance optimize ,cache integer/long valueof

jianghang.loujh 2 years ago
parent
commit
869e831b04

+ 47 - 7
dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java

@@ -4,6 +4,8 @@ import java.io.Serializable;
 import java.nio.charset.Charset;
 import java.sql.Timestamp;
 import java.sql.Types;
+import java.time.ZoneId;
+import java.time.zone.ZoneRules;
 import java.util.BitSet;
 
 import org.apache.commons.logging.Log;
@@ -24,7 +26,11 @@ import com.taobao.tddl.dbsync.binlog.LogEvent;
  */
 public final class RowsLogBuffer {
 
-    protected static final Log logger            = LogFactory.getLog(RowsLogBuffer.class);
+    protected static final Log    logger            = LogFactory.getLog(RowsLogBuffer.class);
+    public static final Long[]    longCache         = new Long[1024 * 128];
+    public static final int       longCacheLimit    = longCache.length + 127;
+    public static final Integer[] integerCache      = new Integer[1024 * 128];
+    public static final int       integerCacheLimit = longCache.length + 127;
 
     public static final long   DATETIMEF_INT_OFS = 0x8000000000L;
     public static final long   TIMEF_INT_OFS     = 0x800000L;
@@ -310,7 +316,7 @@ public final class RowsLogBuffer {
                 // XXX: How to check signed / unsigned?
                 // value = unsigned ? Long.valueOf(buffer.getUint32()) :
                 // Integer.valueOf(buffer.getInt32());
-                value = Integer.valueOf(buffer.getInt32());
+                value = valueOf(buffer.getInt32());
                 javaType = Types.INTEGER;
                 length = 4;
                 break;
@@ -319,7 +325,7 @@ public final class RowsLogBuffer {
                 // XXX: How to check signed / unsigned?
                 // value = Integer.valueOf(unsigned ? buffer.getUint8() :
                 // buffer.getInt8());
-                value = Integer.valueOf(buffer.getInt8());
+                value = valueOf(buffer.getInt8());
                 javaType = Types.TINYINT; // java.sql.Types.INTEGER;
                 length = 1;
                 break;
@@ -328,7 +334,7 @@ public final class RowsLogBuffer {
                 // XXX: How to check signed / unsigned?
                 // value = Integer.valueOf(unsigned ? buffer.getUint16() :
                 // buffer.getInt16());
-                value = Integer.valueOf((short) buffer.getInt16());
+                value = valueOf((short) buffer.getInt16());
                 javaType = Types.SMALLINT; // java.sql.Types.INTEGER;
                 length = 2;
                 break;
@@ -337,7 +343,7 @@ public final class RowsLogBuffer {
                 // XXX: How to check signed / unsigned?
                 // value = Integer.valueOf(unsigned ? buffer.getUint24() :
                 // buffer.getInt24());
-                value = Integer.valueOf(buffer.getInt24());
+                value = valueOf(buffer.getInt24());
                 javaType = Types.INTEGER;
                 length = 3;
                 break;
@@ -346,7 +352,7 @@ public final class RowsLogBuffer {
                 // XXX: How to check signed / unsigned?
                 // value = unsigned ? buffer.getUlong64()) :
                 // Long.valueOf(buffer.getLong64());
-                value = Long.valueOf(buffer.getLong64());
+                value = valueOf(buffer.getLong64());
                 javaType = Types.BIGINT; // Types.INTEGER;
                 length = 8;
                 break;
@@ -871,7 +877,7 @@ public final class RowsLogBuffer {
                 }
                 // logger.warn("MYSQL_TYPE_ENUM : This enumeration value is "
                 // + "only used internally and cannot exist in a binlog!");
-                value = Integer.valueOf(int32);
+                value = valueOf(int32);
                 javaType = Types.INTEGER;
                 length = len;
                 break;
@@ -1212,4 +1218,38 @@ public final class RowsLogBuffer {
             builder.append('0').append(digits[d]);
         }
     }
+
+    public static Long valueOf(long value) {
+        if (value >= -128 & value <= 127) {
+            // if (l >= -128 && l <= 127) {
+            return Long.valueOf(value);
+        }
+        if (value > 127 && value < longCacheLimit) {
+            int cacheIndex = (int) value - 127;
+            Long cacheValue = longCache[cacheIndex];
+            if (cacheValue == null) {
+                cacheValue = new Long(value);
+                longCache[cacheIndex] = cacheValue;
+            }
+            return cacheValue;
+        }
+        return new Long(value);
+    }
+
+    public static Integer valueOf(int value) {
+        if (value >= -128 & value <= 127) {
+            // if (l >= -128 && l <= 127) {
+            return Integer.valueOf(value);
+        }
+        if (value > 127 && value < integerCacheLimit) {
+            int cacheIndex = (int) value - 127;
+            Integer cacheValue = integerCache[cacheIndex];
+            if (cacheValue == null) {
+                cacheValue = new Integer(value);
+                integerCache[cacheIndex] = cacheValue;
+            }
+            return cacheValue;
+        }
+        return new Integer(value);
+    }
 }