Я запускаю несколько тестов для файлового ввода-вывода и заметил довольно большую разницу между тестами с настройкой и без нее, когда оба делают одно и то же. Я ожидал, что тест, использующий состояние/настройку, будет намного быстрее. Может кто-нибудь объяснить, почему первый на самом деле должен быть быстрее второго?
Я пробовал запускать их в другом порядке, в разных файлах, но результаты остались практически такими же.
Эталон 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
JMH медленнее с объектом @state ⇐ JAVA
Программисты JAVA общаются здесь
1731076520
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[i] = FileChannel.open(files[i], 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[i];
int fileSize = (int) Files.size(path);
int offset = plan.random.nextInt(0, fileSize - READ_SIZE);
FileChannel fc = plan.fileChannels[i];
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[i] = FileChannel.open(files[i], 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79170428/jmh-slower-with-state-object[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия