Форум программистов, компьютерный форум, киберфорум
Комментарии
Войти
Регистрация
Восстановить пароль
  1. Старый комментарий
    Интересная статья по управлению памятью (JS)
    [QUOTE]знал, в том числе, о большей ресурсоемкости рекурсии по сравнению с циклом.[/QUOTE]И это сложно? Это [B]азы[/B]. И управление памятью здесь вообще ни причём. Всё дело в необходимости хранения адреса возврата, дублировании локальных переменных в каждом экземпляре функции и двойном цикле. [CPP]uint64 f1(int x)
    {
    int r=1;
    int i=1;
    for (i=1; i<=x; ++x)
    {
    r*=i;
    }
    }
    uint64 f2(int x)
    {
    if (x==1)
    {
    return 1;
    }
    return x*f2(x-1);
    }
    int main ()
    {
    int f;
    f=f1(10);
    f=f2(10);
    return 0;
    }[/CPP]
    В строке f=f1(10); вызывается 1 экземпляр функции, она имеет 1 адрес возврата, 1 параметр x, и 1 значение, 1 счётчик, 1 раз выполняет цикл. Итого: 6 величин, 10 шагов одного цикла. В строке f=f2(10); вызывается 10 экземпляров функции:
    1-й экземпляр вызывается по f=f2(10),
    2-й по return x*f2(x-1) в 1-м, эквивалентно return 10*f2(9),
    3-й по return x*f2(x-1) во 2-м, эквивалентно return 9*f2(8),
    4-й по return x*f2(x-1) в 3-м, эквивалентно return 8*f2(7),
    5-й по return x*f2(x-1) в 4-м, эквивалентно return 7*f2(6),
    6-й по return x*f2(x-1) в 5-м, эквивалентно return 6*f2(5),
    7-й по return x*f2(x-1) в 6-м, эквивалентно return 5*f2(4),
    8-й по return x*f2(x-1) в 7-м, эквивалентно return 4*f2(3),
    9-й по return x*f2(x-1) в 8-м, эквивалентно return 3*f2(2),
    10-й по return x*f2(x-1) в 9-м, эквивалентно return 2*f2(1),
    вся цепочка уже эквивалентна циклу из 9-ти шагов, но каждый экземпляр имеет по параметру и хранит по адресу возврата, это уже 20 величин, го это ещё не всё, пока ни один из 9-ти первых экземпляров не знает, на что умножать x, так как f2(x-1) не известна, чтоб её получить нужны возвраты значений из 9-ти последних экземпляров:
    10-й возвращает 1 в x*f2(x-1) в 9-м, 9-й подставляет и получает return 2*1,
    9-й возвращает 2 в x*f2(x-1) в 8-м, 8-й подставляет и получает return 3*2,
    8-й возвращает 2 в x*f2(x-1) в 7-м, 7-й подставляет и получает return 4*6,
    7-й возвращает 2 в x*f2(x-1) в 6-м, 6-й подставляет и получает return 5*24,
    6-й возвращает 2 в x*f2(x-1) в 5-м, 5-й подставляет и получает return 6*120,
    5-й возвращает 2 в x*f2(x-1) в 4-м, 4-й подставляет и получает return 7*720,
    4-й возвращает 2 в x*f2(x-1) в 3-м, 3-й подставляет и получает return 8*5040,
    3-й возвращает 2 в x*f2(x-1) в 2-ом, 2-й подставляет и получает return 9*40320,
    2-й возвращает 2 в x*f2(x-1) в 1-ом, 1-й подставляет и получает return 10*362880, это эквивалентно ещё одному циклу из 9-ти шагов, и того: 20 величин, 18 шагов в двух циклах, первый вызов первого экземпляра и последний возврат из него совпадают с циклической версией. Это не зависит ни от языка, ни от архитектуры, ни от схем управления памятью, это суть самой рекурсии. Но всё меняется, когда рекурсивны сами данные, например, при обходе дерева. Попытка заменить рекурсию циклом на таких задачах безтолку усложнит исходник, а запутавшийся программист имеет все шансы раздуть расход и памяти, и машинного времени до совсем уж гигантских значений. Сократить же ресурсоёмкость по сравнению с рекурсией в таких случаях не возможно, так как "съэкономленные" память и время тут же будут занята явными переменными и операциями для поддержки неявной рекурсии.
    Запись от размещена 29.11.2012 в 08:45
    Обновил(-а) taras atavin 29.11.2012 в 09:20
  2. Старый комментарий
    Запись от GuardCat размещена 29.11.2012 в 08:09 GuardCat вне форума
  3. Старый комментарий
    Интересная статья по управлению памятью (JS)
    дык и написал бы в заголовке что в JS
    Запись от Jupiter размещена 28.11.2012 в 21:06 Jupiter вне форума
  4. Старый комментарий
    Исследование ресурсоёмкости setTimeout
    Про копейки вы не правы. Не у всех сильные машины сейчас,я пересел обратно с хрома на оперу именно из-за потребления памяти. Большое спасибо тем, кто не ложит хер и заботится о потребляемых ресурсах
    Запись от ai-zer размещена 31.05.2012 в 21:12 ai-zer вне форума
  5. Старый комментарий
    Аватар для Alex_pac
    Исследование ресурсоёмкости setTimeout
    Цитата:
    клинтские долгоиграющие программы
    поскольку автор сам сделал вывод, что при последовательном назначении таймер не будет потреблять память, так как таймер будет каждый раз самоуничтожаться после того как отработал.

    Поэтому:

    JS можно использовать для "долгоиграющих программ"
    Запись от Alex_pac размещена 31.05.2012 в 12:13 Alex_pac вне форума
  6. Старый комментарий
    Аватар для snake32
    Исследование ресурсоёмкости setTimeout
    В очередной раз убеждаюсь что писать клинтские долгоиграющие программы лучше без использования браузеров. Лучше юзать С++/Object Pascal. JS не канает
    Спасибо!
    Запись от snake32 размещена 31.05.2012 в 11:47 snake32 вне форума
  7. Старый комментарий
    Аватар для GuardCat
    Исследование ресурсоёмкости setTimeout
    Цитата:
    Сообщение от Alex_pac Просмотреть комментарий
    Да ладно копейки все считать...
    Если речь о странице, которую открывают на пару минут --- соглашусь. Хотя даже в этом случае, при установке большого количества таймеров одновременно, комп начинает тормозить.

    А если речь о приложении, которое должно быть открыто длительное время, то экономию считаю целесообразной.
    Запись от GuardCat размещена 30.05.2012 в 22:06 GuardCat вне форума
  8. Старый комментарий
    Аватар для Alex_pac
    Исследование ресурсоёмкости setTimeout
    Да ладно копейки все считать. Щас в среднем у браузеры у всех потребляют от 200 мб RAM
    а то бывает и до 400 доходит.

    При сегодняшнем прогрессе, думаю не стоит учитывать что там JS на странице не успел очистить.
    Запись от Alex_pac размещена 30.05.2012 в 17:10 Alex_pac вне форума
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.