dad*_*egs 2 java networking json jackson jsoup
我使用简单的Jackson代码将我的对象转换为json String,但它确实很慢.在我的机器中只转换一个对象需要70毫秒.我做了什么吗?
ObjectMapper myObjectMapper = new ObjectMapper();
void testJson()
{
MyClass state = new MyClass();
try
{
String result = myObjectMapper.writeValueAsString(state);
} catch (Exception ex)
{
}
}
Run Code Online (Sandbox Code Playgroud)
MyClass只有4名成员
MyClass
{
public int a;
public int b;
public int c;
public String d;
}
Run Code Online (Sandbox Code Playgroud)
我使用简单的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基准测试.
| 归档时间: |
|
| 查看次数: |
4159 次 |
| 最近记录: |