Я хочу проверить скорость различных методов сериализации. Поэтому мне нужен класс. Для моей цели этот класс должен включать только члены примитивных типов данных, и каждый объект класса должен иметь размер около 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 для инициализации всех полей всех объектов вместо создания одного объекта Random для каждого поля. В любом случае, сериализация объекта занимает одно и то же время независимо от того, являются ли значения полей случайными.
Это работает, когда я хочу проверить скорость различных сериализаций? То есть на самом деле тогда вам нужно сохранить только одно поле.
О, ладно, я подумал, что разные методы имеют значение.
Зачем вообще присваивать ценность этим лонгам? Несомненно, длинное число со значением ноль сериализуется так же быстро, как и любое другое значение? (Или выберите любое другое постоянное значение)
Потенциально может быть разница в сериализации номеров с разным количеством цифр.
@IvanSkalauh, если это так, выбор случайных значений не гарантирует, что вы получите размер «около 80 байт».
Он имел в виду размер java-объекта, насколько я понимаю (он будет постоянным). Размер сериализованной строки, конечно, будет отличаться.




Не вызывайте "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
Спасибо, это тот ответ, который я искал.
Может быть, если бы вы не создавали новый объект Random для каждой инициализации поля ...