Java 为什么多个ObjectMapper Instances创建不成功';不要花太多时间?
我执行一个简单的测试——在一行中创建几个ObjectMapper对象。我这样做是因为我想了解它的成本。有很多资料说ObjectMapper是线程安全的,而且创建它的工作量很大。所以我希望看到的是,每个ObjectMapper创建都需要一些时间。但是当我在Eclipse调试器中浏览这些行时,我发现只有第一次创建ObjectMapper需要一些时间。有人能解释为什么吗?这是一些编译器优化吗?还是我遗漏了什么? 这是我的测试:Java 为什么多个ObjectMapper Instances创建不成功';不要花太多时间?,java,jackson,Java,Jackson,我执行一个简单的测试——在一行中创建几个ObjectMapper对象。我这样做是因为我想了解它的成本。有很多资料说ObjectMapper是线程安全的,而且创建它的工作量很大。所以我希望看到的是,每个ObjectMapper创建都需要一些时间。但是当我在Eclipse调试器中浏览这些行时,我发现只有第一次创建ObjectMapper需要一些时间。有人能解释为什么吗?这是一些编译器优化吗?还是我遗漏了什么? 这是我的测试: String inputString = "{\"key1\":\
String inputString = "{\"key1\":\"value1\"}";
String inputString2 = "{\"key2\":\"value2\"}";
String inputString3 = "{\"key3\":\"value3\"}";
String inputString4 = "{\"key4\":\"value4\"}";
try {
HashMap<String, Object> map = new ObjectMapper().readValue(inputString, HashMap.class);
HashMap<String, Object> map2 = new ObjectMapper().readValue(inputString2, HashMap.class);
HashMap<String, Object> map3 = new ObjectMapper().readValue(inputString3, HashMap.class);
HashMap<String, Object> map4 = new ObjectMapper().readValue(inputString4, HashMap.class);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String inputString=“{\'key1\':\'value1\'”;
字符串inputString2=“{\'key2\':\'value2\'”;
字符串inputString3=“{\'key3\':\'value3\'”;
字符串inputString4=“{\'key4\':\'value4\'”;
试一试{
HashMap map=newObjectMapper().readValue(inputString,HashMap.class);
HashMap map2=new ObjectMapper().readValue(inputString2,HashMap.class);
HashMap map3=new ObjectMapper().readValue(inputString3,HashMap.class);
HashMap map4=new ObjectMapper().readValue(inputString4,HashMap.class);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
我查看了ObjectMapper
实例的初始化,可以验证所描述的行为:
StopWatch '': running time = 2323937394 ns
---------------------------------------------
ns % Task name
---------------------------------------------
2233845422 096 % map1
030696401 001 % map2
029092790 001 % map3
030302781 001 % map4
原因似乎是初始化了ObjectMapper
实例的静态块和静态成员字段,该实例仅在第一次加载类时运行
在执行ObjectMapper
构造函数之前,将执行com.fasterxml.jackson.databind.ObjectMapper。(
静态初始值设定项,它设置ObjectMapper
实例的所有静态字段,如com.fasterxml.jackson.databind.cfg.BaseSettings。(
等
此后,当第一次运行
ObjectMapper
构造函数时,初始化其非静态成员的所有静态字段和静态块,例如com.fasterxml.jackson.core.JsonFactory。(
,这需要额外的时间。这些静态初始化步骤仅在第一次执行构造时运行。测量结果在哪里?此外,使用调试器进行任何与时间相关的基准测试都是错误的。