我们正在开发一个对延迟敏感的应用程序,并已对所有类型的方法进行微基准测试(使用jmh).在对查找方法进行微基准测试并对结果感到满意之后,我实现了最终版本,但却发现最终版本比我刚刚基准测试的版本慢了3倍.
罪魁祸首是实现的方法返回一个enum对象而不是一个int.以下是基准代码的简化版本:
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class ReturnEnumObjectVersusPrimitiveBenchmark {
enum Category {
CATEGORY1,
CATEGORY2,
}
@Param( {"3", "2", "1" })
String value;
int param;
@Setup
public void setUp() {
param = Integer.parseInt(value);
}
@Benchmark
public int benchmarkReturnOrdinal() {
if (param < 2) {
return Category.CATEGORY1.ordinal();
}
return Category.CATEGORY2.ordinal();
}
@Benchmark
public Category benchmarkReturnReference() {
if (param < 2) {
return Category.CATEGORY1;
}
return Category.CATEGORY2;
}
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 作为一个程序员,我认为这些是寻找像"java.lang.Object中的地址1a234552"或类似的相似s的
Object s = "hello";
Run Code Online (Sandbox Code Playgroud)
它是否正确?因此所有引用都是固定大小的?
当我在某处读到时,在创建实例并从堆分配空间时分配内存.如果它是正确的,那么在实例和对象创建期间分配了多少内存?