我使用简单的Jackson代码将我的对象转换为json String, 但它确实很慢。如下所示,仅转换一个对象需要70毫秒 在我的机器上。我做了什么吗?
ObjectMapper myObjectMapper = new ObjectMapper();
void testJson()
{
MyClass state = new MyClass();
try
{
String result = myObjectMapper.writeValueAsString(state);
} catch (Exception ex)
{
}
}
只有4名成员的MyClass
MyClass
{
public int a;
public int b;
public int c;
public String d;
}
答案 0 :(得分:5)
我使用简单的Jackson代码将我的对象转换为json String,但它确实很慢。在我的机器中只转换一个对象需要70毫秒。我做了什么吗?
编码和发送JSON消息70毫秒是不可信的。毫无疑问,我真正的解释是,70毫秒的测量结果是您对代码进行基准测试的方法。可能,你没有允许JVM预热效果。
所以,是的,你做错了你的基准测试。可能。
现在我发现了三种通过网络发送MyClass实例的解决方案:1:使用Jackson转换为byte []并发送。 2:使用内置序列化转换为byte []并发送。 3:将MyClass的成员转换为String,然后转换为byte []并发送。还有其他更好的解决方案吗?
理论上(即如果你有足够的技巧,时间和耐心),可以通过手动将数据编码到字节缓冲区并发送它来实现最佳性能。但那只是理论上的。
如果您正在寻找可能比您尝试过的替代品更快的实用解决方案,请查看Google Protocol Buffers。他们被认为是快...
一个对象70毫秒,但是当我尝试1000个对象时,它只需要114毫秒,不奇怪吗?
实际上,当你考虑JVM的工作方式时,并不奇怪。
当JVM启动时,它会加载您的代码并使用字节码解释器开始运行它。在对代码进行了一些解释之后,JVM运行JIT编译器,为经常调用的方法生成优化的本机代码。这个编译过程需要很长时间。
因此,当您测量发送一个对象所花费的时间时,您可能真的测量发送一个对象的时间并进行一堆JIT编译。但JIT编译工作不需要重复。净结果 - 处理一个对象出现需要花费相当长的时间,而不是1000。
JIT编译是常见的JVM预热效果之一,可能会扭曲编写糟糕的Java基准测试。