#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 не исключение - здесь тоже это многократно происходило, например здесь
Комментариев нет:
Отправить комментарий