![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Jilian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 24.1.2005 Где: Минск Репутация: нет Всего: нет |
Добрый день!
У меня было собеседование, но котором мне задали следующий вопрос. Как происходит распределение ПМ в перл и сколько занимает переменная $_ по умолчанию. Не могли бы вы дать мне пару статей на эту тему. Как-то этот вопрос не освящался ни в книгах, ни на форумах. Спасибо большое! |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
"ПМ в перл" -- ?
|
|||
|
||||
Jilian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 24.1.2005 Где: Минск Репутация: нет Всего: нет |
What is $_? How many memory taken this variable by default? Как вы понимаете, первый вопрос затруднений не вызвал, а вот второй.... |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Jilian, по поводу размера $_ я тоже не знал. Судя по
Переменная занимает 12 байт (как и любой другой неинициализированный скаляр); Это сообщение отредактировал(а) ginnie - 8.7.2008, 11:51 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
ginnie, опередил! Это сообщение отредактировал(а) amg - 8.7.2008, 12:00 |
|||
|
||||
Jilian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 24.1.2005 Где: Минск Репутация: нет Всего: нет |
Спасибо всем большое. =) Теперь буду знать, что отвечать на такие вопросы =)
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Jilian, подобных вопросов придумать можно еще много. Простых: размер пустого массива или хеша, и сложных: из чего этот размер складывается
![]() Это сообщение отредактировал(а) ginnie - 8.7.2008, 12:02 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Jilian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 24.1.2005 Где: Минск Репутация: нет Всего: нет |
В компании нужен был человек, который мог бы написать пару несложных скриптов на перле. Кастомеры попались странные, спрашивали как представить строку из китайских иероглифов и всякое в этом роде, так что вопрос с переменной $_ еще был нормальным =)
А где можно почитать про то, как складывается размер переменных в перле? |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
ИМХО вопрос не корректный. Т.к распределение памяти скрыто от программиста. И им занимается только сам Perl. И размер соотвественно скалярных переменных содержащих одно и тоже может быть разным в разных версиях Perl.
|
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый amg, не подскажите, как связан вопрос "Сколько занимает минимальный элемент хэша?" с "потому как часто случается, что на хэш из 20 М элементов гига памяти вдруг не хватает"?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Это я к тому, что оценка размера хэша в памяти по очевидной, казалось бы, формуле (число элементов) х 2 х (средний размер ключей/величин) приведет к ошибке (собственный печальный опыт). Для прикидок к среднему размеру ключей/величин необходимо прибавлять еще некое число (и немаленькое), связанное с размером минимального элемента хэша. Это сообщение отредактировал(а) amg - 8.7.2008, 13:27 |
|||
|
||||
Jilian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 24.1.2005 Где: Минск Репутация: нет Всего: нет |
2 amg
А не подскажите, с чем связана необходимость прибавления этого числа? |
|||
|
||||
AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
||||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Много интересного можно прочитать в Perl 5 Internals. AlexPet, вопросы я написал по аналогии с заданным про размер $_. Смысл они имеют, разве что при поиске хорошего разработчика XS-модулей или Perl-хакера ![]() Сами по себе подобные знания мало что дают (кроме осознания собственной "крутизны"), важно выяснить умение их использования соискателем для решения реальных задач. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
ginnie, полностью с Вами согласен. Просто подумал, а вдруг что-то упустил, какую-нибудь интересную мелочь?
![]() |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Поигрался с модулем Devel::Size, заодно провел небольшое исследование о памяти, занимаемой различными структурами. Использовал функцию size(), подсчитывающую память, занимаемую самой структурой (в случае нескаляров -- без данных). В модуле есть еще функция total_size() (память для структуры вместе с данными), но она глючит на хэшах. Вот результаты:
undef 12 b Целые числа 0-4294967296 (2**32) 16 b, далее 20 b Числа с floating point 20 b Строки 28 + $n - $n%4 ($n - длина строки) Массивы Анонимный массив 56 + @$aref*4 + $data (@$aref - число элементов массива, $data - суммарный объем данных, вычисляемый по предыдущим формулам) Именованный массив Почему то все сложнее, четкой закономерности я не обнаружил, но приближенно верна формула для анонимного массива В первом приближении -- данные + 4 байта на каждый элемент Хеши Совсем все сложно (92 + (22+length($key))*$n + 2**(length(sprintf("%b",$n))+2)-32) + $data Это приближенная формула (в некоторых случаях она не дает точное значение). length($key) - длина ключа хэша (я использовал ключи одинаковой длины, для прикидок можно брать среднюю длину ключа, или максимальную, чтобы с запасом), $n - число элементов хэша (пар ключ-значение), $data - суммарный объем данных (при вычислении нужно помнить, что ключи, как оказалось, если они числа, автоматически превращаются в строки и памяти занимают больше). В нулевом приближении -- данные + 32 байта на каждый элемент. Пример того, что хэшами нужно пользоваться с осторожностью Стандартная задача: организовать быстрый доступ к элементам массива (не по номеру, а по значению). Используют преобразование массива в хэш. Массив из миллиона целых чисел [1..1000000] занимает в памяти очень умеренные по нынешним временам 20 М. Хэш {map {$_=>""} 1..1000000}, полученный из этого массива, занимает 410 М. Уже опасно даже по нынешним временам. Использование в качестве значений хэша undef вместо пустой строки "" помогает, но не спасает (экономит лишь 16 М; основное место, 320 М, в этом хэше занимают не данные, а сама структура). _____________________________ PS Все эти формулы я толком не тестировал, может, они и неправильные. Очевидно, будет зависимость от архитектуры машины и, возможно, от версии Perl (у меня - linux x32, perl 5.8.8) _____________________________ PPS Что-то я туплю. Как проще вычислить для числа ближайшую к нему (снизу) степень двойки? (вместо того, что у меня 2**(length(sprintf("%b",$n))) ) Это сообщение отредактировал(а) amg - 10.7.2008, 08:28 |
|||
|
||||
AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
||||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
Jilian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 24.1.2005 Где: Минск Репутация: нет Всего: нет |
Вы знаете, только что услышала мнение одного специалиста в перл, что изначально переменная $_ занимает все свободную память.
|
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Хм.. думаю будет по сабжу. Давно интересовал такой вопрос.
При использовании регулярных выражений, и некоторых функций работающих со строковыми данными, например,
В данном случае, для того чтобы вытащить из строки некоторую его часть с помощью регулярного выражения, память расходуется ровно, или приблизительно, в два раза больше чем память занимаемая $1. Есс-но я не имею ввиду занимаемую память, в которой хранится весь текст($text). Поэтому при работе с большими текстами, советуют делить строковые данные на более мелкие части, например, построчно. Все никак не рожу, чтоб поискать и почитать про причины такого поведения. -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
При этом еще переменныя $+ заполняется тем же самым.
|
|||
|
||||
Ramirez |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Во многих случаях хеши можно заменить массивами. Можно даже "изобразить" доступ по ключу для удобства:
хотя, зачастую вместо констант используется такая конструкция:
http://www.perl.com/doc/manual/html/pod/pe...stant_Functions в http://www.perl.com/doc/manual/html/lib/constant.html пишут, что: In the current implementation, scalar constants are actually inlinable subroutines. As of version 5.004 of Perl, the appropriate scalar constant is inserted directly in place of some subroutine calls, thereby saving the overhead of a subroutine call. See Constant Functions for details about how and when this happens. Интересно, как сейчас с этим обстоят дела. Если константа это функция, это ведь оверхед получается неслабый... попробовал
У меня массив из 1000 элементов занимал 24 килобайта, а хеш - 52 килобайта. Т.е. хеш в 2 раза дороже. Если использовать массив с константами в качестве "индексов" то к массиву плюс 20 * 1000 = 20 килобайт займут константы. Итого размер массива + константы примерно будет равен хешу, что сведет преимущества к нулю. Преимущества от массива с константами перед хешем будет если используется одновременно много таких массивов, т.к. константы/индексы будут общие на все массивы. Это сообщение отредактировал(а) Ramirez - 19.8.2008, 18:09 |
||||||
|
|||||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Ramirez, оверхеда как раз не получается, на этапе компиляции
perl делает локальные оптимизации, вычисляя константы.. собственно говоря, если вы напишите что то вроде:
это будет вычислено 1 раз при компиляции, а результат будет подставлен во все вызовы.. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |