在Java中使用primitve成员创建随机对象

时间:2018-09-15 11:25:11

标签: java class object serialization random

我想测试不同序列化方法的速度。因此,我需要一堂课。出于我的目的,该类必须仅包含原始数据类型的成员,并且该类的每个对象的大小都不得超过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个对象。 有什么解决办法吗?

谢谢

2 个答案:

答案 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