powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Поиск: Искать ответы на сообщение: #729433  
2 сообщений из 2, страница 1 из 1
Языки программирования семейства Pascal / Заметки о Делфи.
    #729433
s62
Скрыть профиль Поместить в игнор-лист
Участник
Может все это знают и так, но вдруг кто-то не знает или забыл. Компилятор под Windows использует менеджер памяти, взятый из опенсорсного проекта FastMM. И у него есть такая фишка, он может при закрытии программы показать неосвобожденную память. ОС конечно всю виртуальную память процесса после его закрытия всё равно заберет, но тут можно видеть, какие объекты были созданы и не удалились.
Делается это так: в файле проекта в начале после begin добавляется строчка:
Код: Delphi
1.
2.
3.
4.
begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
Или можно вот так, тогда при запуске под отладчиком будет выводить, а при обычном запуске - нет, т.е. не надо менять код для билдов в продакшен.
Код: Delphi
1.
2.
3.
4.
begin
  ReportMemoryLeaksOnShutdown := DebugHook <> 0;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
Вот, про настройку менеджера памяти:
https://docwiki.embarcadero.com/RADStudio/Athens/en/Configuring_the_Memory_Manager
...
Рейтинг: 2 / 0
Языки программирования семейства Pascal / Заметки о Делфи.
    #739599
s62
Скрыть профиль Поместить в игнор-лист
Участник
Долгое время для измерения времени по-быстрому (хаха, прошу прощения за получившуюся игру слов) использовал функцию win32 API GetTickCount. Эта функция возвращает время в мсек от начала работы компьютера. Результат имеет тип Cardinal (беззнаковое 4 байтовое целое), так что он зацикливается после 49,7 примерно дней работы Windows. (Есть функция GetTickCount64, которая возвращает Int64).
MS пишет:
Цитата 
[игнорируется]
Разрешение функции GetTickCount ограничено разрешением системного таймера, которое обычно находится в диапазоне от 10 до 16 миллисекундах.
Во многих ситуациях этой точности вполне достаточно. Использовал примерно так:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
var Ticks: Cardinal;

...
  Ticks := GetTickCount;
//тут какой-то код, время исполнения которого измеряем
...
...
//Дальше или выводим куда-то в программе или например пишем в лог
 AddStrToLog(IntToStr(GetTickCount - Ticks));
В последней строчке сначала выполнится GetTickCount, потом вычислится разность, потом выполнится IntToStr и потом AddStrToLog, т.е. во время войдет только то, что мы измеряем, но не время выполнения IntToStr и записи в лог.
Понятно, что тут не учитывается фактор многопоточности, что какое-то время поток, в котором выполняется код, мог спать в то время, когда (если) система выделила кусок (slice) времени другому или другим потокам.

Но в последнее время часто, когда надо померить время, стал использовать точный таймер, для которого есть обертка в Delphi. Обертка в виде записи с методами. У этого таймера период обычно - 0.1 мксек, т.е. частота 10 000 000 гц.
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
uses
  System.Diagnostics;

var
  SW: TStopWatch;
...
  SW := TStopWatch.StartNew;
//тут код, время которого измеряем
...
...
  SW.Stop;
//выводим время в мксек
  AddStrToLog(IntToStr(SW.ElapsedTicks * 1000000 div SW.Frequency));
Я обычно писал попроще (но не совсем корректно), т.к. , когда тестирую и измеряю время на рабочей машине, Frequency можно запросить и посмотреть отдельно, а убедившись, что это 10 000 000, обычно писал так:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
uses
  System.Diagnostics;

var
  SW: TStopWatch;
...
  SW := TStopWatch.StartNew;
//тут код, время которого измеряем
...
...
  SW.Stop;
//выводим время в мксек
  AddStrToLog(IntToStr(SW.ElapsedTicks div 10));
TStopWatch - это обертка для функции win32 API QueryPerformanceCounter и сопутствующих функций.
...
Изменено: 19.03.2024, 12:11 - s62
Рейтинг: 1 / 0
Нравится: Ифрит
2 сообщений из 2, страница 1 из 1
Форумы / Поиск: Искать ответы на сообщение: #729433  
Пользователи онлайн (20): Анонимы (13), Yandex Bot, С чистого листа, Bing Bot, Королева Жезлов, Tosh 1 мин., Брюквенные годы 4 мин., zzdima 8 мин.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]