Создание случайных объектов с примитивными членами в Java - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу проверить скорость различных методов сериализации. Поэтому мне нужен класс. Для моей цели этот класс должен включать в себя только члены примитивных типов данных, и каждый объект класса должен иметь размер около 80 байт.

Я попробовал следующее:

//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 объектов в мс. Но мне нужно до 60000 объектов в мс. Есть ли какое-то решение для этого?

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Содержание полей не имеет значения для большинства стратегий сериализации. 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 голосов
/ 15 сентября 2018

Не вызывайте "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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...