![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый BurnerCode все приведенные модули помогают избавиться от циклических ссылок. В контексте данного топика они бесполезны.
Это сообщение отредактировал(а) ginnie - 11.4.2008, 11:15 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Память не освобождается при выходе из любого блока или только if?
Если блок if поместить в бесконечный цикл? Память закончится? |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый tolkien, похоже, что не освобождается при выходе из любого блока.
При использовании блока внутри цикла память не освобождается, но повторно используется для тех-же самых переменных, поэтому она не может закончится. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Получается Perl вобще память не освобождает в процессе работы?
|
|||
|
||||
| GoDleSS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
Высвобождает, но:
1. Память, выделенную для блоков резервирует под повторное использование. 2. Не удаляет те элементы, на которые сохранились ссылки. --------------------
It's a nice day to die my friend! |
|||
|
||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
ginnie, потестил Ваш код под win32. Как и следовало ожидидать результат тот же. |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
GoDleSS, выделенную не для блоков, а для конкретных переменных (т.е. если в блоке две переменные и под одну выделилось 1 Мб, то в следующем проходе при записи во вторую переменную текста в 1 Мб будет дополнительно выделено 1 Мб)! Добавлено @ 14:40 Вчера выяснил, что эти проблемы с памятью (кроме блоков if), а также многие другие описал Даниил Алиевский в статье "Эффективное использование памяти в Perl при работе с большими строками", опубликованной в журнале Системный администратор в октябре 2002. Это сообщение отредактировал(а) ginnie - 11.4.2008, 15:04 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| GoDleSS |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
Полностью согласен, но не всегда четко выражаю свои мысли ((
Кстати, давным давно читал, занятная статейка в плане оптимизации ) --------------------
It's a nice day to die my friend! |
||||
|
|||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Кстати в той забавной статье написано, что
т.к. при этом для вычисления выражения конкатенации будет выделена память, которую потом нельзя освободить. т.е. я правильно понимаю, что очень_длинная_строка будет отъедать память трижды: в $very_long_text, в выражении $very_long_text . "\n" и в $v ? разве при присваивание переменной выражения память от выражения не освобождается ? (обычный стек) P.S. (to KSURi & co.) Есть какой-нть модуль что бы посмотреть дерево операций ( байт-код т.е.) которое перл строит по выражению ? |
|||
|
||||
| KSURi |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
-------------------- Died at Life.pl line 21 |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
sir_nuf_nuf, посмотри модуль B::Concise. Я, правда, пока еще сам с ним не разобрался до конца.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| tolkien |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
есть разница по ресурсам писать так? my $v = $very_long_text . "\n"; или так my $v = "$very_long_text\n"; |
||||
|
|||||
| GoDleSS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
Практически нет, в обоих случаях будет использовано: память от $very_long_text+ память от "\n"(незначительно) + память, занимаемая объедененной строкой. А вот при print ... лучше использовать print $very_long_text, "\n"; т.к. тут получается 2 раздельных параметра и в случае print $very_long_text, "\n"; занимаемая память удвоится, а в случае print "$very_long_text\n"; утроится Вот такая бяка.... --------------------
It's a nice day to die my friend! |
|||
|
||||
| gcc |
|
||||||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
кстате, вот увидел, кто как пишет и как правильно?
|
||||||||
|
|||||||||
| DaemonSuw |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 11.3.2008 Репутация: 3 Всего: 3 |
По моему правильно так
Этот вариант без все равно что 'SELECT fullname FROM people WHERE $sql_clause' - без интерполяции gcc, "тест освобождения памяти, хочу убедиться, что память освобождается" - но почему вопрос в этом топике? |
||||
|
|||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |