Сколько памяти занимает переменная?

dimagolov

Новичок
weregod, а твой стек рекурсивных вызовов ничего не жрет?
кстати, а как определял объем памяти, который расходуется php на обработку исходного кода?
 

alekciy

Новичок
dimagolov
А насчет 6 раз у него значит данные не точные?
Хотя как я понимаю объем занятый php завит от количества загруженных модулей.
 

weregod

unserializer
Автор оригинала: dimagolov
а твой стек рекурсивных вызовов ничего не жрет?
я же замеряю mem usage уже существующий сущностей, при чем тут стек рекурсивных вызовов?

Автор оригинала: dimagolov
кстати, а как определял объем памяти, который расходуется php на обработку исходного кода?
$m = memory_get_usage() + 74; // 74 байта занимает объявляемая int-переменная

require 'someClass.php';

echo memory_get_usage() - $m, "\n";
 

weregod

unserializer
голову напрячь совсем не получается, откуда константы берутся?

например так:
PHP:
<?php

echo memory_get_usage();
$a = 1;
echo memory_get_usage();
что из чего вычитать, догадаетесь
более неленивый способ - исходный код открытый...
пока его не скупил тот же Sun...
 

dimagolov

Новичок
weregod
да ты что? это для какой версии и платформы? и с чего делается вывод, что это именно память для этой переменной?
кроме того, более чем самоуверенно утверждать "74 байта занимает объявляемая int-переменная". во-первых потому что на разных версиях и платформах это число разное, во-вторых в разных ситуациях кол-во памяти изменяется по-разному, а в третих в php типизация динамическая и одним оператором переменная из int превращается в sting. как тут понять как байты, которые показывает memory_get_usage связаны с конкретной переменной?
чуть более широкий тест:
PHP:
<?php
echo memory_get_usage()."<br />";
$a = 1;
echo memory_get_usage()."<br />";
$b = 1;
echo memory_get_usage()."<br />";
$c = 1;
echo memory_get_usage()."<br />";
$d = 1;
echo memory_get_usage()."<br />";
$e = 1;
echo memory_get_usage()."<br />";
$f = 1.567;
echo memory_get_usage()."<br />";
$g = 1.567;
echo memory_get_usage()."<br />";
$h1 = 1.567;
$h = 1.567;
echo memory_get_usage()."<br />";
$i1 = 1.567;
$i = 1.567;
echo memory_get_usage()."<br />";
$a2 = 'ab';
echo memory_get_usage()."<br />";
$b2 = 'abc';
echo memory_get_usage()."<br />";
$c2 = 'abcd';
echo memory_get_usage()."<br />";
$d2 = 'ab';
echo memory_get_usage()."<br />";
$e2 = 'abc';
echo memory_get_usage()."<br />";
$f2 = 'abcd';
echo memory_get_usage()."<br />";
$g2 = 'ab';
echo memory_get_usage()."<br />";
$h2 = 'abc';
echo memory_get_usage()."<br />";
$i2 = 'abcd';
echo memory_get_usage()."<br />";
?>
дал такие результаты:
PHP Version 5.2.5 on Windows NT 5.2 build 3790
61016
61128 112 int
61152 24 int
61176 24 int
61248 72 int
61320 72 int
61392 72 float
61464 72 float
61608 144 float 2pc
61752 144 float 2pc
61840 88 ab
61928 88 abc
62016 88 abcd
62104 88 ab
62192 88 abc
62280 88 abcd
62368 88 ab
62456 88 abc
62544 88 abcd
а на PHP Version 5.2.5 on FreeBSD 6.2-RELEASE amd64
80896
81192 296 int
81328 136 int
81464 136 int
81600 136 int
81736 136 int
81872 136 float
82008 136 float
82280 272 float 2pc
82552 272 float 2pc
82688 136 ab
82824 136 abc
82992 168 abcd
83160 168 ab
83328 168 abc
83496 168 abcd
83664 168 ab
83832 168 abc
84000 168 abcd
 

alekciy

Новичок
weregod
Ты знаешь.... если бы ты прочел мой первый топик, то наверное не написал бы этот ;)

Это называется найдите десят отличий. Низачот!
 

weregod

unserializer
в моем случае память утекала мегабайтами, поэтому ни на какую абсолютную точность подсчета и не рассчитывал

подсчет вел на одной платформе

dimagolov, по поводу того, что у Вас под int разное место выделяется, непохоже на правду
 

dimagolov

Новичок
dimagolov, по поводу того, что у Вас под int разное место выделяется, непохоже на правду
это типа того что мне нечего делать и я придумывал циферки? просто Вы ну совсем не предстваляете, что PHP делает при определении новой переменной, и по наивности думаете, что все упирается в выделение для нее памяти, из чего делаете неправильный вывод о том, что для переменной одного и того же типа и значения объем используемой памяти должен меняться всегда на одинаковое значение. но это не так. как - смотрите исходники.
я написал код примера, написал на какой платформе и какой версией были получены результаты _именно этого примера_ (разве что для наглядности в excel-е добавил разницу значений и подписал что какому значению в тесте соответствует).
при желании каждый может прогнать и сравнить результаты
 

weregod

unserializer
топик-топиком, но в своей задаче я выяснил то, что мне нужно было

dimagolov, Вы правы

по идее профайлеры должны давать инфу об использовании памяти переменными, но на работе не поднял оных после вынужненнго переезда на висту, а дома ломы...
 

alekciy

Новичок
weregod
А профайлеры используют что-то другое, нежели memory_get_usage() ? ;)
 

WP

^_^
Имхо это неправильно. int/float имеют вполне определенные потребности в памяти, а в случае смены типа следует выделить другую область под них.
 

weregod

unserializer
alekciy
я профайлеры не писал, полагаю, какая ф-ция Zend API может есть
 

dimagolov

Новичок
WP, weregod, да при чем тут сколько памяти занимает конкретная переменная? в PHP автоматическое управление памятью со сборщиком мусора. Как именно он реализован и почему - это к разработчикам и в исходные коды. По большому счету, ничего кроме общего объема используемой памяти знать и не надо, этого более чем достаточно для нахождения мест, где происходят утечки
 

dimagolov

Новичок
alekciy, ответь на такой вопрос, если переменная больше не используется, то есть сделали к примеру unset, то от этого память, в которой хранилось ее значение освободилась или нет?
 

alekciy

Новичок
dimagolov
Э... а почему мне вопрос? Как я понимаю это уничтожит перенную в данном скрипте, но это не значит, что ОЗУ при этом освобождается.
А что там реально не в курсе, сорцы не рыл.
 

dimagolov

Новичок
alekciy, вопрос у тебе, потому что ты процитировал, что по идее профайлеры должны давать инфу об использовании памяти переменными,. Так вот, ничего никому они не должны, так как вопрос об использовании памяти переменной в системе с автоматическим управлением памяти не корректный в принципе. Потому что память используется не переменной, а менеджером памяти.
 

alekciy

Новичок
dimagolov
Нет, ты не понял. Я процитировал это не как ответ, а как продолжение первой цитаты. Просто я немного неправильно прочел сообщение weregod-а поэтому привел цитату немного не в тему. Извиняюсь.
 
Сверху