Я занимаюсь 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?




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