使用Java中的原始成员创建随机对象

问题描述 投票:-1回答:2

我想测试不同序列化方法的速度。因此我需要一堂课。为了我的目的,这个类必须只包括原始数据类型的成员,并且该类的每个对象大约为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个对象。这有什么解决方案吗?

谢谢

java class object serialization random
2个回答
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

0
投票

不要叫“新的随机()”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;
}
© www.soinside.com 2019 - 2024. All rights reserved.