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

fedotxxl

Well-known member
09.11.2005
614
0
#1
Напросал код для тестирования:
Dim myFW As FrameWork
For j = 0 To 1000
If j/100 = Fix(j/100) Then
Print j
finish = Getthreadinfo(6)
Print (finish - start)/TicksPerSecond
End If

Set myFW = New FrameWork
For i = 0 To 30
Call myFW.StartTimer("ABC"+Cstr(i))
Call myFW.EndTimer("ABC"+Cstr(i))
Next
Delete myFW
Next
Интересно то, что при 0<j<100 код исполняется за 2,5 сек, при 100<j<200 - за 17 (j в цикле менятся от 0 до 1000) . В чем собственно разница?
Я подозреваю, что при j = 200 память забита сильнее, чем j = 1... Но почему?
 
S

Sandr

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

fedotxxl

Well-known member
09.11.2005
614
0
#3
Для: Sandr
Угу... имеется ввиду, что к j=200 уже начинает жутко тормозить
 
S

Sandr

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

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

fedotxxl

Well-known member
09.11.2005
614
0
#5
Для: Sandr
Постоянно. Нефига себе погрешность... в 15 секунд

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

Вложения

Y

Yakov

#8
<!--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 будет выглядеть красивее, но это чисто придирка.
 

fedotxxl

Well-known member
09.11.2005
614
0
#9
Ось X - текущее j/10
Ось Y - общее время исполнения (в секундах)
 

Вложения

fedotxxl

Well-known member
09.11.2005
614
0
#10
Хм... очень странно
Я переписал класс myFW - в предыдущей версии на каждый вызов StartTimer создавался инстанс класса Timer и скидывался в список запущенных событий. Сейчас на каждый вызов StartTimer создается инстанс класса Timer, внутри класса Timer создается инстанс класса TimerContent, который хранит в себе только данные и уже инстанс класса TimerContent скидывется в список запущенных событий

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

Yakov

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

fedotxxl

Well-known member
09.11.2005
614
0
#12
Для: Yakov
В моем приложении вообще не используются массивы - везде списки
Странно то, что хотя я и убиваю переменную, присваиваю ей новый экземпляр, все равно остается "история", которая и делает квадратичную зависимость
 
Y

Yakov

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