On Wednesday 02 of November 2011 11:23:10 [email protected] wrote:
> On Wed, 2 Nov 2011, Jonas Maebe wrote:
> > Marco van de Voort wrote on Wed, 02 Nov 2011:
> >> The point was just some encouragement to look further than the immediate
> >> need though, and keep the time call relatively cheap. That doesn't
> >> exclude being correct, it just means a more elaborate implementation.
> >
> > I do not think that reporting the time correctly taking into account the
> > current time zone and daylight savings time is a function that needs to
> > be treated as performance-critical.
>
> Under some (not so uncommon) circumstances it is, e.g. for logging
> facilities. Our own eventlog facility would suffer from this.
>
> >> But harddisk latency can easily be in the half a second to second
> >> magnitude (and then I don't even count spindowns, and am I accessing
> >> directories that I continously access).
> >
> > If you are stat'ing that file for changes all the time, either the result
> > will be cached or the hard drive won't spin down. And stat'ing a file
> > will not take half a second when done repeatedly.
>
> I tested this yesterday, using the following sequence:
>
> fpGettimeOfDay();
> if UseStat then
> fpStat('/etc/timezone');
> fpGetTimeOfDay();
Please see results about Now() and something that I've mentioned about
deprecitation of gettimeofday().According to this test, current
fpgettimeofday() is crap when compared with clock_gettime() (kernel) or libc
calls (I've copied scenario from kylix sysutils).
*Kernel clock_gettime() NowReal() with 10000000 calls = 4870 ms
**Libc gettimeofday()+localtime_r() with 10000000 calls = 5085 ms
***RTL Now() with 10000000 calls = 7659 ms ?!?!?!? Slowest !?!?
Simple program is attached. Maybe I've added something wrong, but you can
correct me if I'm wrong.
zeljko
program unixclocks;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils,
unix, baseunix, Libc, SysCall, unixutil;
const
CLOCK_REALTIME = 0;
CLOCK_MONOTONIC = 1;
CLOCK_MONOTONIC_RAW = 4;
CLOCK_REALTIME_COARSE = 5;
CLOCK_MONOTONIC_COARSE = 6;
CLOCKS_MASK = CLOCK_REALTIME or CLOCK_MONOTONIC;
procedure GetDate__(ATime: longint; var Year, Month, Day: word);
var
hour, minute, second: word;
begin
EpochToLocal(ATime, year, month, day, hour, minute, second);
end;
procedure GetLocalTimeNew(var SystemTime: TSystemTime; const AClockType: byte);
var
ASpec: TimeSpec;
begin
if Do_SysCall(syscall_nr_clock_gettime, AClockType, TSysParam(@ASpec)) = 0 then
begin
with SystemTime do
begin
EpochToLocal(ASpec.tv_sec, year, month, day, hour, minute, second);
Millisecond := ASpec.tv_nsec mod 1000;
GetDate__(ASpec.tv_sec, Year, Month, Day);
end;
end;
end;
function NowReal: TDateTime;
var
SystemTime: TSystemTime;
begin
GetLocalTimeNew(SystemTime, CLOCK_REALTIME);
Result := SystemTimeToDateTime(SystemTime);
end;
function NowMono: TDateTime;
var
SystemTime: TSystemTime;
begin
GetLocalTimeNew(SystemTime, CLOCK_MONOTONIC);
Result := SystemTimeToDateTime(SystemTime);
end;
function NowLibc: TDateTime;
var
T: Libc.time_t;
TV: Libc.TimeVal;
UT: Libc.TUnixTime;
begin
Libc.gettimeofday(TV, nil);
T := TV.tv_sec;
Libc.localtime_r(@T, @UT);
Result := EncodeDate(UT.tm_year + 1900, UT.tm_mon + 1, UT.tm_mday) +
EncodeTime(UT.tm_hour, UT.tm_min, UT.tm_sec, TV.tv_usec div 1000);
end;
function GetTickCount(const AType: Integer = 0): DWord;
var
ATime: TDateTime;
begin
case AType of
1: ATime := NowReal();
2: ATime := NowLibc();
else
ATime := Now();
end;
Result := DWord(Trunc(ATime * 24 * 60 * 60 * 1000))
end;
const
AMsrInt = 10000000;
var
i: integer;
ATicks: DWord;
begin
ATicks := GetTickCount;
for i := 0 to AMsrInt - 1 do
Now();
writeln(Format('RTL Now() with %d calls = %d ms ', [AMsrInt,
GetTickCount - ATicks]));
ATicks := GetTickCount;
for i := 0 to AMsrInt - 1 do
NowReal();
writeln(Format('Kernel clock_gettime() NowReal() with %d calls = %d ms ',
[AMsrInt, GetTickCount - ATicks]));
ATicks := GetTickCount;
for i := 0 to AMsrInt - 1 do
NowLibc();
writeln(Format('Libc gettimeofday()+localtime_r() with %d calls = %d ms ',
[AMsrInt, GetTickCount - ATicks]));
end.
_______________________________________________
fpc-devel maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel