JMH медленнее с объектом @stateJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JMH медленнее с объектом @state

Сообщение Anonymous »

Я запускаю несколько тестов для файлового ввода-вывода и заметил довольно большую разницу между тестами с настройкой и без нее, когда оба делают одно и то же. Я ожидал, что тест, использующий состояние/настройку, будет намного быстрее. Может кто-нибудь объяснить, почему первый на самом деле должен быть быстрее второго?
Я пробовал запускать их в другом порядке, в разных файлах, но результаты остались практически такими же.
Эталон 0:
@Benchmark()
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@OperationsPerInvocation(NR_OF_FILES)
@Threads(MAX)
public void _0_readUsingFileChannelWithChannelSetup(Blackhole blackhole, ExecutionPlanFileChannel plan) throws Throwable {

Random random = new Random(315315153152442L);
Path[] files = BenchmarkFiles.benchmarkFiles;
FileChannel[] fileChannels = new FileChannel[files.length];
for (int i = 0; i < files.length; i++) {
try {
fileChannels = FileChannel.open(files, StandardOpenOption.READ);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

final ByteBuffer data = ByteBuffer.allocate(READ_SIZE);

for (int i = 0; i < files.length; i++) {
final int fileIndex = random.nextInt(0, plan.files.length);
final Path path = files[fileIndex];
final int fileSize = (int) Files.size(path);
final int offset = random.nextInt(0, fileSize - READ_SIZE);
FileChannel fc = fileChannels[fileIndex];
data.rewind();
fc.read(data, offset);
blackhole.consume(data);
}

for (FileChannel fc : fileChannels) {
try {
fc.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

Эталон 1:
@Benchmark()
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@OperationsPerInvocation(NR_OF_FILES)
@Threads(MAX)
public void _1_readUsingFileChannel(Blackhole blackhole, ExecutionPlanFileChannel plan) throws Throwable {
final ByteBuffer data = ByteBuffer.allocate(READ_SIZE);
var paths = BenchmarkFiles.benchmarkFiles;
for (int i = 0; i < paths.length; i++) {
Path path = plan.files;
int fileSize = (int) Files.size(path);
int offset = plan.random.nextInt(0, fileSize - READ_SIZE);
FileChannel fc = plan.fileChannels;
data.rewind();
fc.read(data, offset);
blackhole.consume(data.array());
}
}

состояние контрольного показателя 1
@State(Scope.Benchmark) // or Thread
public class ExecutionPlanFileChannel {

Random random = new Random(315315153152442L);
Path[] files;
FileChannel[] fileChannels;

@Setup
public void setup() {
files = BenchmarkFiles.benchmarkFiles;
fileChannels = new FileChannel[files.length];
for (int i = 0; i < files.length; i++) {
try {
fileChannels = FileChannel.open(files, StandardOpenOption.READ);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

@TearDown
public void tearDown() {
for (FileChannel fc: fileChannels) {
try {
fc.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}

Результат:
Benchmark Mode Cnt Score Error Units
BenchMarkLibUring._0_readUsingFileChannelWithChannelSetup thrpt 5 887.343 ± 19.686 ops/ms
BenchMarkLibUring._1_readUsingFileChannel thrpt 5 196.129 ± 1.580 ops/ms


Подробнее здесь: https://stackoverflow.com/questions/791 ... ate-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»