Я запускал два тестовых примера (несколько раз), и кажется, что итеративное добавление значений в мои списки происходит быстрее, чем использование addAll
String[] rawArgs = new String[]{"one", "two", "three", "four", "five"};
// More efficient - 894 ns
List<String> list = new ArrayList<>();
for (String s : rawArgs) {
list.add(s);
}
// Less efficient - 1340 ns
List<String> list = new ArrayList<>();
list.addAll(Arrays.asList(rawArgs));
Я получаю заметки через мою среду IDE, а также другие люди, что последний способ - это "правильный" способ преобразования массива в эту структуру данных. Но если он на самом деле медленнее первого, какое преимущество есть (какая-то непонятная безопасность типа?) И по какой причине я должен использовать вторую?
Изменить. Проверка кода:
JVM Разогрев, сначала воссоздайте основной объект класса:
public static void main(String[] args) {
Internet test;
for (int i = 0; i < 15; i++) {
test = new Internet(); // JVM warmup
}
test = new Internet();
test.printOutput();
}
Я просто беру системную нанотим на обоих концах операции:
start = System.nanoTime();
/* function */
end = System.nanoTime();
result = end - start;
В этом случае для каждого запуска/завершения есть отдельные поля, а результаты вычисляются после операции (JVM также предварительно нагревается циклическими экземплярами перед запуском тестов).
Изменить 2 - Бенчмаркинг с большими коллекциями
После некоторого тестирования (вместо этого, используя Integer, не собирающийся вручную записывать все числа), кажется, что большие коллекции действительно медленнее:
С 100 номерами:
First operation: 18759ns
Second operation: 2680ns
Total operation: 21439ns