Создание случайных объектов с примитивными членами в Java

Я хочу проверить скорость различных методов сериализации. Поэтому мне нужен класс. Для моей цели этот класс должен включать только члены примитивных типов данных, и каждый объект класса должен иметь размер около 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 объектов в мс. Но мне нужно до 60 000 объектов в мс. Есть ли решение для этого?

Спасибо

Может быть, если бы вы не создавали новый объект Random для каждой инициализации поля ...

JB Nizet 15.09.2018 13:27

Для уверенности. Но тогда объекты не случайны.

WoLFi 15.09.2018 13:28

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

JB Nizet 15.09.2018 13:29

Это работает, когда я хочу проверить скорость различных сериализаций? То есть на самом деле тогда вам нужно сохранить только одно поле.

WoLFi 15.09.2018 13:31

О, ладно, я подумал, что разные методы имеют значение.

WoLFi 15.09.2018 13:32

Зачем вообще присваивать ценность этим лонгам? Несомненно, длинное число со значением ноль сериализуется так же быстро, как и любое другое значение? (Или выберите любое другое постоянное значение)

Andy Turner 15.09.2018 13:32

Потенциально может быть разница в сериализации номеров с разным количеством цифр.

Ivan Skalauh 15.09.2018 13:44

@IvanSkalauh, если это так, выбор случайных значений не гарантирует, что вы получите размер «около 80 байт».

Andy Turner 15.09.2018 14:12

Он имел в виду размер java-объекта, насколько я понимаю (он будет постоянным). Размер сериализованной строки, конечно, будет отличаться.

Ivan Skalauh 15.09.2018 14:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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;
}
Ответ принят как подходящий

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

Спасибо, это тот ответ, который я искал.

WoLFi 16.09.2018 18:16

Другие вопросы по теме