Как узнать сколько памяти занимает переменная?

Krishna

Продался Java
Angerslave
А давай уже ты просто помолчишь, если не можешь просто промолчать, когда не знаешь ответ?
Или ты с трудом терпишь, дабы произнести волшебное слово zval, упоминавшееся несколькими постами выше?

З.Ы.
Инициализация двух переменных даёт 272 байта.
 

Angerslave

Новичок
На моём php 5.2.6 выдал int(24) твой код
Две переменных - int(96).
Теперь понятно, что затыкать собеседника - дурной тон?
 

Krishna

Продался Java
Платформа и ОС какие?
Две переменные с какими значениями?

Я "затыкаю" только демагогию прописных истин.

На моём php 5.2.6 выдал int(24) твой код
Две переменных - int(96).
Это уже что-то конструктивное.

Мне непонятно отчего у меня такой перерасход по отношению к теоретическому.

-~{}~ 01.10.08 15:28:

Angerslave
Кстати, проверь что на одну переменную у тебя пых выделяет 24 байта несколько раз подряд :)
У меня пару раз получалось что при первом запуске результат меньше, чем при последующих %)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Krishna
все, что можно тебе предложить - это сделать экстраполяцию (кажется, это так называется):
выгрузить в память 1000 записей и замерять, добавить несколько связей - опять замерять, выгрузить 5000 и снова замерять
вычетанием отдели примерно память ядра, память на данные умнож на пропорцию данных и кол-ва связей
все это умножь на 1,5 для резерва и получишь оценку необходимого объема, адекватную для твоей задачи
(например, сможешь смело заявить, что 640к хватит для всего :))

-~{}~ 01.10.08 17:10:

Angerslave, ты реально не по теме пишешь
 

Angerslave

Новичок
Krishna
Apache 1.3.3 на WinXP без xdebug. Проверял, запускал по нескольку раз, результат тот же.grigori
grigori
Ага, как и вся тема не по теме, как же :)
 

Krishna

Продался Java
grigori
Спасибо конечно, но до такого решения я и сам дошёл :)
На самом деле я уже принял решение, что выгружать данные такого объёма в память представляется затруднительным и мы пошли по другому, более традиционному пути :)

Сейчас остался уже лишь чистый интерес почему такие результаты астрономические получаются, сильно расходящиеся с теорией про zval. Ну и на будущее может пригодиться.
Мне всё чаще приходится работать с прожорливыми проектами...
Хочется понимать кухню менеджера памяти :)

-~{}~ 01.10.08 18:45:

Angerslave

XP 32bit?
 

Angerslave

Новичок
Ага, 32bit.

-~{}~ 01.10.08 22:15:

Сейчас посмотрел под Linux 32bit, apache 2.2.9, php 5.2.6.
Одна переменная - 72 бит, две - 144.
 

Krishna

Продался Java
Angerslave
Если бы, бит. Я бы тогда и не парился совсем.
То байты, а не биты.

-~{}~ 01.10.08 19:24:

То есть, избыточность у пхп на хранение одного символа (например 'x') в моем случае составляет ДВА ПОРЯДКА (в 133 раз больше, чем надо) :)
 

Angerslave

Новичок
Пардон, задумался:)) 72 байта, конечно, и 144 тоже байта.

Вообще, даже в официальном мане пример:
PHP:
<?php
// This is only an example, the numbers below will
// differ depending on your system

echo memory_get_usage() . "\n"; // 36640

$a = str_repeat("Hello", 4242);

echo memory_get_usage() . "\n"; // 57960

unset($a);

echo memory_get_usage() . "\n"; // 36744

?>
Во-первых - заголовок - потребление памяти может отличаться на разных системах. Второе - unset не возращает старое потребление памяти. То есть есть определённые накладные расходы и они чувствительны при таком замере потребления памяти. Из этого вполне обоснованно можно сделать вывод, что пытаться замерить сколько в пхп переменная весит в байтах есть ни что иное, как борьба с ветряными мельницами.
 

Krishna

Продался Java
Если что-то не столь же просто как 2*2 это не значит, что не стоит пытаться понять как оно работает.
 

Angerslave

Новичок
Тогда надо лезть в сорцы и смотреть, а не рассуждать на форумах о сферических конях в вакууме:) Но я думаю, подводных камней в этом деле очень много - зависимости от платформы, типов сборки, разделяемой между процессами памяти и т.п. С другой стороны, быстро утоляет любопытство:)
 

Krishna

Продался Java
Проблема в том, что времени мало, да и с Си я уже лет 7 дел не имел :(
Да и не верится мне всё же, что никто этот вопрос не поднимал :)
Просто быстро нагуглить не вышло..
 

weregod

unserializer
Angerslave, при 3-5-мегабайтном коде на php и задаче "выявить утечки памяти" адекватный замер памяти, занимаемой переменной, очень помог бы

вообще интересно, почему до сих пор нет встроенной ф-ции, мало кому надо или менеджер памяти не обладает этими данными? ;)
 

Angerslave

Новичок
А разве xDebug не кажет потребление памяти в разных частях кода?
 

Alexandre

PHPПенсионер
Тогда надо лезть в сорцы и смотреть, а не рассуждать на форумах о сферических конях в вакууме
копать сорцы всегда полезно
vld попробуй использовать для оценки, хотя я этим игструментом не пользовался http://www.derickrethans.nl/vld.php

свои высказывания о приблизительной оценки занимаемой памяти я высказал после изучения слайдов о строении переменных с php.net

нодо смотреть сырци функции memory_get_usage()
могут быть подводные камни... и много
 

weregod

unserializer
Angerslave, потребление памяти укажет memory_get_usage(), но кто потребил эту память?
 
Сверху