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