gpt4 book ai didi

java - 为什么我的 Java 序列化在单次转换和多次转换方面表现不佳?

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

下面是我的基准测试代码。首先,我尝试序列化单个对象。然后我尝试做同样的事情一百万次。我预计时间会成比例增加。相反,我得到

1323048944117 1323048944131
1323048944117 1323048944210

14ms for one object
93ms for 1mil objects

这里发生了什么?我最担心的是单个对象转换的时间,我希望能达到亚毫秒级。

import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Pojo implements Serializable {
String blah = "11111111111111111111aaaaaaaaaaaaaaaaaaaa";
}

public class SerializeTest {
public static void main(String[] args) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = null;
Pojo pojo = new Pojo();
long start = 0;
long end1 = 0;
try {
out = new ObjectOutputStream(bos);
start = System.currentTimeMillis();
out.writeObject(pojo);
end1 = System.currentTimeMillis();
for (int i=0;i<1000000;i++) {
out.writeObject(pojo);
}

} catch (Exception ex) {

}
long end2 = System.currentTimeMillis();
System.out.println(start + " " + end1);
System.out.println(start + " " + end2);

}
}

最佳答案

最终 @duffmo 是对的,你的结果 98% 是关于用 Java 进行微测试的问题,而不是关于序列化的问题。他发布了good link to read .

另一个让你的测试感到困惑的因素是序列化是智能的。写入第一个对象会写入所有类和字段信息以及数据。同一对象实例的第二次到第 n 次写入仅写入对第一个对象的引用。第一个对象看起来大约有 120 字节,剩下的每个对象只有 5 字节。它的速度也会快很多,因为它做的事情要少得多。

我的测试在 8 毫秒内完成第一个对象,在 5 毫秒内完成接下来的 1000 个对象,然后在 2000 毫秒内完成一百万个对象。这主要向您展示了序列化的速度有多快。它还向您展示了 Java 进行了一些神奇的实时优化,这些优化导致了显着的非线性速度图。

如果您尝试进行一些序列化速度测试,我会让您的 Pojo 类生成一些随机数(或随机字符串),并且我会将 1000 个对象的序列化与 100 万个对象的序列化进行比较,以获得更好地比较每个对象的序列化时间。要么在你写了 1000 个对象之后开始计时。例如,写入不同的对象会生成约 10 倍大的文件,但只花费了 5600 毫秒。

关于java - 为什么我的 Java 序列化在单次转换和多次转换方面表现不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8380176/

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