Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Какой вариант проверки условия наиболее производителен?

#java #производительность #if #benchmark


int a = 0;
String b = "0";



вариант:

if(String.valueOf(a).equals(b)) {}

вариант:

if(Integer.valueOf(b) == a) {}


    


Ответы

Ответ 1



Немного результатов измерений: # JMH version: 1.20 # VM version: JDK 1.8.0_151, VM 25.151-b12 # CPU: Intel Core i7-6700 3.40 GHz (4 cores, 8 threads) Benchmark Mode Cnt Score Error Units MyBenchmark.stringValueOfInteger avgt 15 26.363 ± 0.112 ns/op MyBenchmark.integerValueOfString avgt 15 13.990 ± 0.129 ns/op MyBenchmark.integerToString avgt 15 26.247 ± 0.260 ns/op MyBenchmark.integerPlusString avgt 15 15.541 ± 0.227 ns/op Код бенчмарка: @State(Scope.Benchmark) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class MyBenchmark { private int a; private String b; @Setup(Level.Invocation) public void setup() { a = 0; b = "0"; } @Benchmark public void stringValueOfInteger(Blackhole blackhole) { blackhole.consume(String.valueOf(a).equals(b)); } @Benchmark public void integerValueOfString(Blackhole blackhole) { blackhole.consume(Integer.valueOf(b) == a); } @Benchmark public void integerToString(Blackhole blackhole) { blackhole.consume(Integer.toString(a).equals(b)); } @Benchmark public void integerPlusString(Blackhole blackhole) { blackhole.consume(("" + a).equals(b)); } } Пояснения к результату: самый быстрый вариант (~14 нс на операцию): Integer.valueOf(b) == a (да, Integer.parseInt(b) == a) показывает примерно тот же результат) чуть менее быстрый (~15.5 нс на операцию): ("" + a).equals(b) разница в ~10 нс, пожалуй, не особо важна для вашего приложения

Ответ 2



Пример кода: int[] a = new int[1000000]; String[] b = new String[1000000]; for(int i = 0; i < 1000000; i++){ a[i] = i; b[i] = "8"; } long start = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++){ if(String.valueOf(a[i]).equals(b[i])){ } } System.out.println(System.currentTimeMillis() - start); start = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++){ if(Integer.valueOf(b[i]) == a[i]){ } } System.out.println(System.currentTimeMillis() - start); Результаты в мс (4 запуска): 1 вариант: 203 | 156 | 484 | 140 2 вариант: 32 | 47 | 47 | 32

Комментариев нет:

Отправить комментарий