Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Скорость обращения к локальным и глобальным переменным

#java


Заинтересовала разница в скорости обращения к глобальным и локальным переменным(в
других темах ответ не был найден). Есть 2 переменные - long set глобальная и long set
локальная. При 10 млрд изменений глобальной переменной, время работы составляло 3.600
сек. При тех же 10 млрд, но с локальной переменной время стало на 400 мсек меньше(3.200
сек). В чем причина такой огромной разницы? Понимаю, что замеры сделаны, грубо говоря,
"на коленке", но все же, причина в чем-то кроется.

package other;

public class w {
static long time;
long set = 0; //static or not = 3600 ms
public static void main(String[] args) {

    new w().test();
}
public void test(){
    long set = 0; // 3200 ms
    System.out.println("Thread " + Thread.currentThread().getName() + " become work!");
    time = System.nanoTime();
    for(long a = 0; a < 10000000000L; a++)
        set = a;
    time = (System.nanoTime() - time);
    System.out.println("End of " + Thread.currentThread().getName() + " with "+ time/1000000.0
+ "millisec");
}
}

    


Ответы

Ответ 1



Разница проявляется из-за разницы в месте хранения. Глобальные и статические переменные помещаются в сегмент данных Локальные (автоматические) переменные помещаются в стек При прочих равных условиях, обычно - обращение к стеку работает быстрее обращения к сегменту данных. Однако, сейчас с виртуализацией адресных пространств и проч. фишками все очень зыбко, непредсказуемо и зависит от конкретной реализации. Вообще, споры о том что быстрее: куча, сегмент данных или стек - это любимая тема срача/холивара в разных форумах. ruSO не исключение - здесь тоже это многократно происходило, например здесь

Комментариев нет:

Отправить комментарий