我想测试不同序列化方法的速度。因此我需要一堂课。为了我的目的,这个类必须只包括原始数据类型的成员,并且该类的每个对象大约为80Byte。
我试过以下:
//Header = 16 Bytes
//long = 8 Byte
// => 80 Byte
public class TestClass implements Serializable {
private long a = new Random().nextLong();
private long b = new Random().nextLong();
private long c = new Random().nextLong();
private long d = new Random().nextLong();
private long e = new Random().nextLong();
private long f = new Random().nextLong();
private long g = new Random().nextLong();
private long h = new Random().nextLong();
}
所以我创建了对象:
for (int i = 0; i < 200000; i++) {
TestClass object = new TestClass();
//do something;
}
这里的问题如下。这每秒仅创建大约846个对象。但我每毫秒需要多达60,000个对象。这有什么解决方案吗?
谢谢
对于大多数序列化策略,字段的内容无关紧要。 esp Java序列化。但是,对于序列化策略而言,随机数据可能是一个糟糕的选择,因为这会给你带来比你实际可能得到的更糟糕的结果。
为每个实际对象创建10个Random
对象是昂贵的(注意Random也包含一个对象)
解决这个问题的方法是重用ThreadLocalRandom
或者只是用一些数据填充值,即使不是太随机。
static class TestClass implements Serializable {
private long a, b, c, d, e, f, g, h;
public TestClass(long i) {
a = i;
b = a * i;
c = b * i;
d = c * i;
e = d * i;
f = e * i;
g = f * i;
h = g * i;
}
}
public static void main(String[] args) {
for (int t = 0; t < 5; t++) {
long start = System.currentTimeMillis();
List<TestClass> list = LongStream.range(0, 100_000)
.mapToObj(TestClass::new)
.collect(Collectors.toList());
long time = System.currentTimeMillis() - start;
System.out.println("Created " + list.size() + " objects in " + time + "ms");
}
}
版画
Created 100000 objects in 64ms
Created 100000 objects in 6ms
Created 100000 objects in 6ms
Created 100000 objects in 5ms
Created 100000 objects in 4ms
不要叫“新的随机()”200000次,一个就够了:
public class TestClass implements Serializable {
private long a,b,c,d,e,f,g,h;
public TestClass(Random rnd) {
a = rnd.nextLong();
// etc.
}
}
和
Random rnd = new Random();
for (int i = 0; i < 200000; i++) {
TestClass object = new TestClass(rnd);
//do something;
}