Очищение памяти

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 9 фев 2008.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Напросал код для тестирования:
    Интересно то, что при 0<j<100 код исполняется за 2,5 сек, при 100<j<200 - за 17 (j в цикле менятся от 0 до 1000) . В чем собственно разница?
    Я подозреваю, что при j = 200 память забита сильнее, чем j = 1... Но почему?
     
  2. Sandr

    Sandr Гость

    Немного не понял..
    Вы хотите сказать, что от 100 до 200 в 7 раз работает медленней чем от 0 до 100 ?Круто... ща проверим..
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Sandr
    Угу... имеется ввиду, что к j=200 уже начинает жутко тормозить
     
  4. Sandr

    Sandr Гость

    Сколько раз проводился эксперимент? Это могла быть погрешность из-за нагруженности системы в момент проведения итераций эксперимента...

    Нужна статистика... :)
     
  5. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Sandr
    Постоянно. Нефига себе погрешность... в 15 секунд

    Приложил свои тесты в файле. Инфа берется при помощи команд
    Код (Text):
    Lsi_info(50) ' LotusScript Memory Allocated
    Lsi_info(52) ' LotusScript Blocks Used
    К сожалению, что это такое я точно не знаю, но явно чем больше, тем хуже
    Хочу повторить, если ещё не поняли, скрипт исполняется непрерывно... Просто после j>200 я прерываю исполнение агента
     

    Вложения:

  6. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    Для: fedotxxl
    проблема кроется в черном ящике под названием "FrameWork"
     
  7. Sandr

    Sandr Гость

    Хе-хе, этак на FrameWork можно любую проблему спихнуть.. :)
     
  8. Yakov

    Yakov Гость

    <!--QuoteBegin-fedotxxl+9:02:2008, 23:40 -->
    <span class="vbquote">(fedotxxl @ 9:02:2008, 23:40 )</span><!--QuoteEBegin-->Просто после j>200 я прерываю исполнение агента
    [snapback]97370" rel="nofollow" target="_blank[/snapback]​
    [/quote]А вот зря прерываете эксперимент. Стоит гнать цикл даже не 1000, а до 10000 и смотреть на цифры внимательно. Можно даже график в Ёкселе построить. Очень интересный график получится, особенно по памяти.
    <!--QuoteBegin-Kee_Keekkenen+10:02:2008, 00:09 -->
    <span class="vbquote">(Kee_Keekkenen @ 10:02:2008, 00:09 )</span><!--QuoteEBegin-->проблема кроется в черном ящике под названием "FrameWork"
    [snapback]97375" rel="nofollow" target="_blank[/snapback]​
    [/quote]Проблема кроется в черном ящике под названием виртуальная машина LS и сборщик мусора.
    <!--QuoteBegin-fedotxxl+9:02:2008, 05:47 -->
    <span class="vbquote">(fedotxxl @ 9:02:2008, 05:47 )</span><!--QuoteEBegin-->If j/100 = Fix(j/100) Then
    [snapback]97322" rel="nofollow" target="_blank[/snapback]​
    [/quote]По моему, If j Mod 100 = 0 Then будет выглядеть красивее, но это чисто придирка.
     
  9. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Ось X - текущее j/10
    Ось Y - общее время исполнения (в секундах)
     

    Вложения:

    • LNP2.JPG
      LNP2.JPG
      Размер файла:
      13,6 КБ
      Просмотров:
      43
  10. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Хм... очень странно
    Я переписал класс myFW - в предыдущей версии на каждый вызов StartTimer создавался инстанс класса Timer и скидывался в список запущенных событий. Сейчас на каждый вызов StartTimer создается инстанс класса Timer, внутри класса Timer создается инстанс класса TimerContent, который хранит в себе только данные и уже инстанс класса TimerContent скидывется в список запущенных событий

    В итоге:
    время исполнения абсолютно линейно, Memory Allocated = const, Blocks Used = const
     
  11. Yakov

    Yakov Гость

    Квадратичный рост времени характерен для кода вида
    Код (Text):
    For i = 1 To 1000
    Redim Preserve someArray(count)
    someArray(count) = someValue
    count = count + 1
    Next
    Чтобы избежать такого и приблизить время к линейному, нужно избегать частого использования Redim Preserve. См. к примеру мой класс VariantList.
    В той же теме приведены тесты использования коллекциями памяти. Если следить за изменением количества использованной памяти в процессе наполнения коллекций, то можно увидеть места, в которых работает сборщик мусора.
     
  12. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Yakov
    В моем приложении вообще не используются массивы - везде списки
    Странно то, что хотя я и убиваю переменную, присваиваю ей новый экземпляр, все равно остается "история", которая и делает квадратичную зависимость
     
  13. Yakov

    Yakov Гость

    Для: fedotxxl
    А чем список не массив? Даже два массива: массив тэгов и массив значений.
    Я стараюсь явно удалять объекты оператором Delete. В методе Delete() класса "убиваю" все объекты также явно. Список удаляется оператором Erase(myList).
     
Загрузка...

Поделиться этой страницей