pascalabcnet/bin/Lib/Utils.pas
Mikhalkovich Stanislav 4fda4ed8fb Utils Benchmark
2022-11-01 20:42:12 +03:00

59 lines
1.6 KiB
ObjectPascal

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
unit Utils;
interface
uses System;
function RecordToByteArray(obj : object): array of byte;
procedure ShowMessage(msg: string);
procedure ShowMessage(msg,capt: string);
function GetFunctionPointer(fnc : Delegate) : integer;
/// Замеряет время работы процедуры p в миллисекундах. Производит n запусков и усредняет время работы
function Benchmark(p: procedure; n: integer := 100): real;
implementation
uses System.Runtime.InteropServices;
function _MessageBox(h: integer; m,c: string; t: integer): integer;
external 'User32.dll' name 'MessageBox';
procedure ShowMessage(msg:string);
begin
ShowMessage(msg,'Сообщение');
end;
procedure ShowMessage(msg,capt:string);
begin
_MessageBox(0,msg,capt,0);
end;
function RecordToByteArray(obj : object): array of byte;
begin
var len := Marshal.SizeOf(obj);
Result := new byte[len];
var ptr := Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, false);
Marshal.Copy(ptr, Result, 0, len);
Marshal.FreeHGlobal(ptr);
end;
function GetFunctionPointer(fnc : Delegate) : integer;
begin
Result := System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(fnc).ToInt32;
end;
function Benchmark(p: procedure; n: integer): real;
begin
var sw := new Stopwatch;
sw.Start;
loop n do
p;
sw.Stop;
Result := sw.ElapsedMilliseconds/n;
end;
begin
end.