Задача заключалась в оценке скорости работы отдельных идентичных потоков в рамках одного процесса и выявления зависимости падения скорости от количества потоков. Мне показалось интересным рассмотреть другой аспект данной задачи, а именно - оценить результаты работы полученной программы в windows и linux. Вот что получилось:
- Код: Выделить всё
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}
uses
{$IFDEF UNIX} {$IFDEF UseCThreads}cthreads,{$ENDIF} unix,{$ENDIF}
Classes,SysUtils;
type
{ TMyThread }
TMyThread=class(TThread)
res:string;
procedure execute;override;
function doWork:string;
end;
{$IFDEF UNIX}
function TMyThread.doWork:string;
var counter:int64; tz1,tz2:timeval; dsec,dusec:longint;
begin
fpgettimeofday(@tz1,nil);
counter:=0;
while (counter<1000000000) do begin
inc(counter);
end;
fpgettimeofday(@tz2,nil);
dsec:=tz2.tv_sec-tz1.tv_sec;
dusec:=tz2.tv_usec-tz1.tv_usec;
if dusec<0 then begin dec(dsec); inc(dusec,1000000); end;
result:=inttostr(dsec)+':'+inttostr(dusec div 1000);
end;
{$ELSE}
function TMyThread.doWork:string;
var tm1,tm2:tdatetime;
counter:int64;
begin
tm1:=now;
counter:=0;
while (counter<1000000000) do begin
inc(counter);
end;
tm2:=now;
result:=formatdatetime('tt:zzz',tm2-tm1);
end;
{$ENDIF}
{ TMyThread }
procedure TMyThread.execute;
begin
res:=doWork;
end;
const maxths=15;
var ths:array[1..maxths] of tmythread;
i:integer;
begin
for i:=1 to maxths do ths[i]:=TMyThread.Create(true);
for i:=1 to maxths do ths[i].Resume;
for i:=1 to maxths do ths[i].WaitFor;
for i:=1 to maxths do writeln(ths[i].res);
for i:=1 to maxths do ths[i].Free;
end.
В данной задаче создаем 15 замороженных потоков, в теле каждого из которых - цикл на 1 миллиард итераций (cкорость работы единичного потока на моем компьютере - около 5.5 секунд с небольшими колебаниями как под windows, так и под linux). Затем - последовательно размораживаем все потоки, а следующим циклом - ожидаем завершения работы каждого из них, после чего выводим на экран время работы каждого потока.
Результаты работы под windows:
- Код: Выделить всё
0:00:41:453
0:00:40:234
0:00:40:578
0:00:39:765
0:00:40:469
0:00:39:406
0:00:41:562
0:00:39:281
0:00:41:047
0:00:39:469
0:00:41:047
0:00:40:047
0:00:41:469
0:00:39:547
0:00:41:063
Результаты работы под linux:
- Код: Выделить всё
39:803
37:462
39:476
39:716
39:576
39:833
39:867
39:965
39:901
37:635
37:360
37:587
37:529
37:296
37:231
Выводы: с многопоточными приложениями Linux работает несколько более эффективно, чем Windows.
P.S. Для обеспечения равных условий опции компилятора freepascal были выставлены идентичными для Windows и Linux, сторонние приложения во время тестирования - far под windows, konsole(kde) - под linux, при этом загрузка процессора приложениями и системными службами была не более 1%.