Установка начальной емкости в Arraylist - не лучшая идея?

Я занимаюсь Java-разработкой в ​​течение трех лет, но никогда не задумывался об основных затратах на производительность между различными реализациями списков. Вот почему я делаю такой тест:

private static int N = 10000000;
public static void main(String args[]){
    doSt(new ArrayList<String>());
    doSt(new ArrayList<String>(N));
    doSt(new LinkedList<String>());
}

private static List<String> doSt(List<String> fizzbuzz) {
    long l = System.currentTimeMillis();
    int counter = 1;
    while(counter <= N){
        fizzbuzz.add("aa");
        counter++;
    }
    long l2 = System.currentTimeMillis();
    System.out.println("time spent " + (l2-l));
}

и я вижу

затраченное время 148,

потраченное время 33,

затраченное время 198,

означающий, что

производительность по времени (ArrayList с начальной емкостью)> производительность по времени (ArrayList)> производительность по времени (LinkedList).

LinkedList и ArrayList довольно близки, поскольку в обеих реализациях вставка O (1), меня не беспокоит небольшая разница.

НО, если я изменю реализацию, например:

private static int N = 10000000;
public static void main(String args[]){
    doStWithIfElse(new ArrayList<String>());
    doStWithIfElse(new ArrayList<String>(N));
    doStWithIfElse(new LinkedList<String>());
}

private static List<String> doStWithIfElse(List<String> fizzbuzz) {
    long l = System.currentTimeMillis();
    int counter = 1;
    while(counter <= N){
        if (counter %3 == 0 && counter %5 == 0){
            fizzbuzz.add("FizzBuzz");
        }
        else if (counter %3 == 0){
            fizzbuzz.add("Fizz");
        }
        else if (counter %5 == 0){
            fizzbuzz.add("Buzz");
        }
        else{
            fizzbuzz.add(Integer.toString(counter));
        }            counter++;
    }
    long l2 = System.currentTimeMillis();
    System.out.println("time spent " + (l2-l));
}

тогда,

затраченное время 516,

затраченное время 8452,

затраченное время 6808,

Затем Внезапно ArrayList с начальной емкостью становится худшим исполнителем, а ArrayList без начальной емкости превосходит их всех с большим отрывом.

Это меня очень смутило. В чем причина изменения производительности, когда я ввожу операторы if else?

Просто переключитесь между вызовами трех методов, и вы уже увидите огромную разницу во времени. Ваш тест просто неверен.

Ben 05.06.2018 13:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
28
0

Другие вопросы по теме