Код Java, обрабатывающий целые числа в штучной упаковке, быстрее, чем примитивная версия?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Код Java, обрабатывающий целые числа в штучной упаковке, быстрее, чем примитивная версия?

Сообщение Anonymous »

У меня есть следующий код, Java 8, но он встречается и в более новых версиях, таких как Java 21:

Код: Выделить всё

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(
value = 1,
jvmArgs = {
"-XX:-TieredCompilation",
"-Xms16g"
})
public class Test {
private static final int[] NUMS = IntStream.range(0, 100_000).toArray();
private static final Integer[] BOXED_NUMS = Arrays.stream(NUMS).boxed().toArray(Integer[]::new);

@Benchmark
public int m1() {
return Arrays.stream(NUMS)   // IntStream
.map(i -> i * i)
.sum();
}

@Benchmark
public int m2() {
return Arrays.stream(BOXED_NUMS)   // Regular stream
.mapToInt(i -> i * i)   // Turns to IntStream
.sum();
}

public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(Test.class.getSimpleName())
.build();

new Runner(options).run();
}
}

Код: Выделить всё

IntStream
работает с примитивами, должно быть быстрее...
Получил следующие результаты:

Код: Выделить всё

Benchmark  Mode  Cnt    Score   Error  Units
Test.m1    avgt    5  281.326 ± 2.409  us/op
Test.m2    avgt    5   46.450 ± 0.520  us/op
Что мне также кажется странным, так это то, что из mapToInt он превращается в IntStream, то есть он аналогичен m1, что является еще одной причиной того, что он будет работать медленнее, поскольку он меняет поток, в отличие от m1, которому это не нужно...
Так почему же m2 быстрее?
EDIT: добавлено все элементы, связанные с JMH, в коде.
EDIT2: добавлены результаты JMH на M1 Mac

Подробнее здесь: https://stackoverflow.com/questions/784 ... ve-version
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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