Кодирование Я пришел проверить производительность Vararg в Java.
Я пишу следующий тестовый код:
public class T {
public static void main(String[] args) {
int n = 100000000;
String s1 = new String("");
String s2 = new String("");
String s3 = new String("");
String s4 = new String("");
String s5 = new String("");
long t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
foo();
}
System.err.println(System.currentTimeMillis() - t);
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
baz(s1, s2, s3, s4, s5);
}
System.err.println(System.currentTimeMillis() - t);
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
bar(s1, s2, s3, s4, s5);
}
System.err.println(System.currentTimeMillis() - t);
}
static void foo() {
}
static void bar(String a1, String a2, String a3, String a4, String a5) {
}
static void baz(String... a) {
}
}
На моей машине средняя производительность:
78
4696
78
Кажется, что передача переменных в методы бесплатна ?! Хорошо!
Но использование varags медленнее в 60 раз! Почему?
Объяснение может состоять в том, что программа должна создать массив в куче, а время тратит GC. Но для меньшего количества циклов я все еще получаю как вывод:
0
62
0
На что тратится это дополнительное время, и в любом случае у компилятора есть вся информация, чтобы разрешить это в вызове переменной fix ...
Это не мое намерение оптимизировать для этого, но я нашел это любопытным ...
Обновление
Я добавил новый тест
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
baz(s1);
}
System.err.println(System.currentTimeMillis() - t);
И эта версия с одним аргументом все еще в 30 раз медленнее. Может быть, за сценой стоит ArrayList.toArray ()?
Так что помните о ненужных методах varags в вашем коде и рефакторинге для фиксированной длины. Это может быть повышение производительности.