IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> "Шаровая" оперативка, Или программное увеличение оперативной памяти, Fpc
сообщение
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Заинтересовал? smile.gif Вот они - чудо компиляторы...

Запускаем код и радуемся результатам:

type
ar=array[1..65456] of byte;
ar2=array[1..327600] of byte;
var p:^ar;
p2:^ar2;
begin
writeln('Free memory before allocation: ',GetHeapStatus.TotalFree);
new(p);
writeln('Free memory after allocation: ',GetHeapStatus.TotalFree);
dispose(p);
writeln('Free memory after dispose: ',GetHeapStatus.TotalFree);
new(p2);
writeln('Again allocation: ',GetHeapStatus.TotalFree);
dispose(p2);
writeln('Again dispose: ',GetHeapStatus.TotalFree);
readln;
end.


Системный блок раскручивать необязательно - все изменения проходят на программном уровне.
P.S. Не знаю как энергия, но память из ниоткуда можно получить.. Fpc is the best smile.gif
P.P.S.
Причина, наверно, кроется вот в чем:
Прикрепленное изображение
Т.е. тип cardinal, возвращаемый методом TotalFree, не имеет постоянного размера, и меняется в зависимости от присваиваемого значение. Имхо.
Так вот, вопрос: как в Fpc измерять разницу свободной памяти до и после размещения в ней данных, без всяких таких казусов?

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Bokul, доки внимательно читал? smile.gif
Цитата(prog.pdf)
8.4.3 Debugging the heap
Free Pascal provides a unit that allows you to trace allocation and deallocation of heap memory:
heaptrc.
If you specify the -gh switch on the command-line, or if you include heaptrc as the first unit in
your uses clause, the memory manager will trace what is allocated and deallocated, and on exit of
your program, a summary will be sent to standard output.
ну, и близлежащие параграфы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Ясно, GetHeapStatus для этих целей не годится - надо юзать модуль heaptrc sad.gif

Вот в таком формате heaptrc выдает свой заголовок (а потом еще 200 метров отчета):
Цитата

Heap dump by heaptrc unit
1010000 memory blocks allocated : 12840000/16880000 - что значат выделенные числа?
10000 memory blocks freed : 840000/880000 - что значат выделенные числа?
1000000 unfreed memory blocks : 12000000
True heap size : 80216064 (80 used in System startup)
True free heap : 215984
Should be : 8215984

Цитата
It displays the total memory used, and then dumps a list of blocks that were allocated but not freed

На что надо смотреть? На unfreed memory blocks?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
На что надо смотреть? На unfreed memory blocks?
В принципе - да, именно это показывает тебе, есть ли у тебя утечки... Так вот, если утечек нет - то нет ничего кроме заголовка...

Насчет цифр -
Цитата
12840000/16880000
Первая - это количество байт, запрошенных компилятором, вторая - число выделенных байт (с учетом гранулярности - ибо память выделяется блоками по 8 байт, и запросив 1 байт ты получишь 8)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Ага, спасибо! smile.gif
Цитата
(с учетом гранулярности - ибо память выделяется блоками по 8 байт, и запросив 1 байт ты получишь 8

Или 16..
Цитата
Each time the block is allocated, its size is normalized to have granularity of 16 bytes


Так что на самом деле дает GetHeapStatus.TotalFree? Для чего возвращаемый результат может иметь разный размер и как узнать весь объем доступной памяти?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
как узнать весь объем доступной памяти
Ха... Что значит "весь объем"?

Цитата(prog.pdf)
8.7 Memavail and Maxavail
The old Turbo Pascal functions MemAvail and MaxAvail functions are no longer available in Free Pascal as of version 2.0. The reason for this incompatibility is below:
On modern operating systems the idea of "Available Free Memory" is not valid for an application.
The reasons are:
1. One processor cycle after an application asked the OS how much memory is free, another application may have allocated everything.
2. It is not clear what "free memory" means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Итак, что будем считать всей памятью? wink.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
2. It is not clear what "free memory" means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Ага, при тестировании той проги при количестве полигонов больше миллиона комп начинал жутко тормозить, а индикатор обращения к винту не утихал - размер кеша доходил до 2 гиг.
Цитата
Итак, что будем считать всей памятью?

Задам вопрос по-другому: как проверит при запуске программы доступно ли для ее работы, например, гигабайт памяти?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






А это тебе никто не скажет... У тебя swap-файл какой разрешен? Сколько физической памяти стоит? Сколько ее свободно в момент запуска программы? Даже если свободно больше физической памяти, чем ты указал, то кто сказал, что через секунду после запуска твоей программы не запустится, скажем, антивирус, или какой-нибудь сервис с более высоким приоритетом, и не сожрет львиную долю памяти?
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.04.2024 22:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name