【问题标题】:Create random Objects with primitve members in Java在 Java 中创建具有原始成员的随机对象
【发布时间】:2019-02-19 23:48:28
【问题描述】:

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

谢谢

【问题讨论】:

  • 也许如果你没有为每个字段初始化创建一个新的 Random 对象...
  • 当然。但是对象不是随机的。
  • 是的。只需使用 one Random 对象来初始化所有对象的所有字段,而不是为每个字段创建一个 Random 对象。无论如何,序列化一个对象需要相同的时间,无论字段值是否是随机的。
  • 这在我想测试不同序列化的速度时有效吗?我的意思是,实际上你只需要保存一个字段。
  • 哦,好吧,我认为使用不同的方法会有所不同。

标签: java class object serialization random


【解决方案1】:

字段的内容对于大多数序列化策略来说并不重要。尤其是 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

【讨论】:

  • 谢谢,这是我正在寻找的答案。
【解决方案2】:

不要调用“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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-12-18
    • 2015-03-26
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多