performance optimize ,cache integer/long valueof

This commit is contained in:
jianghang.loujh
2022-11-16 19:41:41 +08:00
parent f7a4979b15
commit 869e831b04

View File

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