Это интересный вопрос, и мне нравится анализ @misiu_mp, поэтому я подумал, что обновлю его тестом 2016 года на Nexus 7 под управлением Android 6.0.1.Вот тестовый код:
public void runSpeedTest() {
long startTime;
long[] times = new long[100000];
long[] staticTimes = new long[100000];
for (int i = 0; i < times.length; i++) {
startTime = System.nanoTime();
for (int j = 0; j < 1000; j++) {
emptyMethod();
}
times[i] = (System.nanoTime() - startTime) / 1000;
startTime = System.nanoTime();
for (int j = 0; j < 1000; j++) {
emptyStaticMethod();
}
staticTimes[i] = (System.nanoTime() - startTime) / 1000;
}
int timesSum = 0;
for (int i = 0; i < times.length; i++) { timesSum += times[i]; Log.d("status", "time," + times[i]); sleep(); }
int timesStaticSum = 0;
for (int i = 0; i < times.length; i++) { timesStaticSum += staticTimes[i]; Log.d("status", "statictime," + staticTimes[i]); sleep(); }
sleep();
Log.d("status", "final speed = " + (timesSum / times.length));
Log.d("status", "final static speed = " + (timesStaticSum / times.length));
}
private void sleep() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void emptyMethod() { }
private static void emptyStaticMethod() { }
Был добавлен sleep()
, чтобы предотвратить переполнение буфера Log.d
.
Я много раз играл с ним, и результаты были довольно согласны с@misiu_mp:
10^5 iterations of 1000 calls to an empty static void function: 29ns/call
10^5 iterations of 1000 calls to an empty non-static void function: 34ns/call
Вызов статического метода всегда был немного быстрее, чем вызов нестатического метода, но может показаться, что а) разрыв значительно сократился с Android 2.3.2 и б) все еще естьстоимость вызова пустого метода, статического или нет.
Однако, глядя на гистограмму времени, можно обнаружить кое-что интересное.Большинство вызовов, независимо от того, статические они или нет, занимают от 30 до 40 нс, и при внимательном рассмотрении данных они точно равны 30 нс.
Выполнение того же кода с пустыми циклами (комментирование вызовов методов) приводит к средней скорости 8 нс, однако около 3/4 измеренного времени равно 0 нс, а остальные - ровно 30 нс.
Я неЯ уверен, как учесть эти данные, но я не уверен, что выводы @ misiu_mp все еще верны.Разница между пустыми статическими и нестатическими методами незначительна, и преобладание измерений составляет ровно 30 нс.При этом может показаться, что использование пустых методов все еще имеет ненулевую стоимость.