LINUX.ORG.RU

А ссылки жрут память?

 


0

1

Напрмер, возьмем код

o={one: 1, two: 2}
O=function(){this.one=o.one; this.two=o.two}
o1=new O
o2=new O
console.log(o1, o2)
//  { one: 1, two: 2 } { one: 1, two: 2 }
Тут все дочерние объекты, которые будут созданы классом O содержат ссылки на 1 и 2. Эти 1 и 2, по идее, являются нативными объектами, в единственном экземпляре. Все объекты, в данном случае, содержат только ссылки на них. Сам по себе вновь созданный объект, понятное дело, отжирает память. Но вот отжирают ли ощутимое количество памяти ссылки, находящиеся в нем? Допустим, наклепал я экземпляров O тысячу штук, как это отразится на памяти, без учета создания самих объектов, именно то, что они будут содержать 2 тысячи ссылок на 1 и 2? Как проверить это?

Наклепай 1000 000 000 ссылок и глянь на память.

Dron ★★★★★
()
<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
  var a = { one: 'one', two: 'two' };
  var b = {};
  var i = 2000;
  var go = function() {
    for (i = 10000000; i > 0; i--) {
      b[i] = a;
    }
    alert('Done!');
  }
</script>
<button onclick="go()">Go!</button>
</body>
</html>
Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 1)
Ответ на: комментарий от Black_Roland

А не может быть, что там основное время тратится на создание этих ссылок? Ведь ты же создаешь, на каждой итерации новую ссылку?

terminator-101
() автор топика

Ссылка обычно отжирает либо столько же места, сколько указатель, либо чуть больше.

PolarFox ★★★★★
()

Спасибо всем большое, понятно.

terminator-101
() автор топика

Жрут, это ж адрес в памяти. Сам адрес тоже занимает 64 бита, к примеру. Поэтому x64 проги жрут чуть больше, чем x86.

menangen ★★★★★
()
Ответ на: комментарий от Black_Roland

Вообще неправильный тест. На создание свойств объекта тоже тратится память. Знаю что при использовании delete ссылки очищаются не всегда, но воспроизвести не получается.

Так думаю правильнее:

<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
  var a = { one: 'one', two: 'two' };
  var b = [];
  var i;
  for (i = 10000000; i > 0; i--) {
    b[i] = null;
  }
  var go = function() {
    for (i = 10000000; i > 0; i--) {
      b[i] = a;
    }
    alert('Done!');
  }
</script>
<button onclick="go()">Go!</button>
</body>
</html>
Сначала забиваю массив значениями null, потом заменяю значения на ссылки на a. В итоге 78.9МБ до и 79.0МБ после нажатия «Go!». http://storage5.static.itmages.com/i/14/1025/h_1414239480_9878626_4764bc283e.png (в конце я GC запустил)

Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.