我想测试不同序列化方法的速度。因此,我需要一堂课。出于我的目的,该类必须仅包含原始数据类型的成员,并且该类的每个对象的大小都不得超过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个对象。 有什么解决办法吗?
谢谢
答案 0 :(得分:0)
不要调用“ new Random()” 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;
}
答案 1 :(得分:0)
对于大多数序列化策略,字段的内容并不重要。 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