gpt4 book ai didi

java - 为什么创建多个 ObjectMapper 实例不需要太多时间?

转载 作者:行者123 更新时间:2023-12-02 08:47:08 24 4
gpt4 key购买 nike

我执行了一个简单的测试 - 我连续创建了多个 ObjectMapper 对象。我这样做是因为我想了解它的成本。有很多资源说 ObjectMapper 是线程安全的,并且它的创建很繁重。所以我期望看到的是每个 ObjectMapper 创建都需要一些时间。但是,当我查看 Eclipse 调试器中的各行时,我发现只有第一次创建 ObjectMapper 才需要一些时间。有人能解释一下为什么吗?是一些编译器优化吗?或者我错过了什么?这是我的测试:

    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();
}

最佳答案

我查看了 ObjectMapper 的初始化实例并可以验证所描述的行为:

StopWatch '': running time = 2323937394 ns
---------------------------------------------
ns % Task name
---------------------------------------------
2233845422 096 % map1
030696401 001 % map2
029092790 001 % map3
030302781 001 % map4

原因似乎是ObjectMapper的静态 block 和静态成员字段的初始化。仅在第一次加载类时运行的实例。

ObjectMapper执行之前构造函数com.fasterxml.jackson.databind.ObjectMapper.<clinit>()执行静态初始化程序,它设置 ObjectMapper 的所有静态字段。例如 com.fasterxml.jackson.databind.cfg.BaseSettings.<clinit>()等等

此后,当 ObjectMapper构造函数第一次运行时,其非静态成员的所有静态字段和静态 block 都被初始化,例如 com.fasterxml.jackson.core.JsonFactory.<clinit>()这需要额外的时间。这些静态初始化步骤仅在第一次执行构造时运行。

关于java - 为什么创建多个 ObjectMapper 实例不需要太多时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61007516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com