Cкорость работы многопоточного кода в Windows и Linux

Интересные алгоритмы, олимпиадные задачи, эффектные и эффективные решения. freepascal, delphi, c, c++, c#, java, javascript, perl, ruby, python, php, bash, wsh и т.д. Компиляторы, интерпретаторы, линкеры, отладчики, системы контроля версий и многое другое.

Модератор: xdsl

Cкорость работы многопоточного кода в Windows и Linux

Сообщение xdsl 11 дек 2008, 01:54

По мотивам лабораторных работ предмета "Параллельное программирование".
Задача заключалась в оценке скорости работы отдельных идентичных потоков в рамках одного процесса и выявления зависимости падения скорости от количества потоков. Мне показалось интересным рассмотреть другой аспект данной задачи, а именно - оценить результаты работы полученной программы в 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%.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение Vladislav_133 16 дек 2008, 02:52

К самому эксперименту есть вопросы.

1. Сравнивать следует Linux и Windows 2003 (или 2008), т.е. серверные ОС. В сравнивать с Windows XP бессмысленно. А я предполагаю, что так оно и было.
2. Для такого сравнения все таки следует использовать не Паскаль, а, скажем, Си и чистые системные вызовы.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение xdsl 16 дек 2008, 14:08

Vladislav_133 писал(а):К самому эксперименту есть вопросы.
1. Сравнивать следует Linux и Windows 2003 (или 2008), т.е. серверные ОС. В сравнивать с Windows XP бессмысленно. А я предполагаю, что так оно и было.
Однако linux был десктопным вариантом - AltLinux 4.0.2 Desktop, а не Server. Поэтому посчитал корректным вести сравнение именно с Windows XP. Корректную проверку на сервере можно провести только при наличии двойной загрузки линуксового и виндовых серверов. Таких машин в обозримом окружении у меня, к сожалению, нет.

Vladislav_133 писал(а):2. Для такого сравнения все таки следует использовать не Паскаль, а, скажем, Си и чистые системные вызовы.
Возможно. Предлагаю Вам на досуге реализовать сишный многопоточный вариант на windows api, а я постараюсь перевести его api-специфику на linux-cthread. Скомпилируем, проверим, сравним, сделаем выводы.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение Vladislav_133 17 дек 2008, 19:11

Да, этот вопрос интересный и следует его проработать.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение xdsl 17 дек 2008, 23:05

Еще пару слов по поводу Си и Паскаля. Общеизвестно, что Паскаль проигрывает Си в эффективности результирующего машинного кода. К тому-же "родной" для меня язык - паскаль, а любимая ось - линукс. Поэтому, если моя программа на паскале под линуксом будет по всем параметрам "бить" Вашу на Си под виндовсом, то смысла переписывать мой вариант на Си не вижу ;)
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение Vladislav_133 18 дек 2008, 19:57

Писать в Linux на Паскале? Фи.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение xdsl 18 дек 2008, 21:41

Vladislav_133 писал(а):Писать в Linux на Паскале? Фи.

А как-же Ваше
1. Оставить "споры" и "дискуссии" не по существу, что можно видеть на других форумах (но не на всех).
;)
Если серьезно, то по сути результирующий машинный код отличается мало.
Например
1.1 программу на Си:
Код: Выделить всё
#include <stdio.h>
int main ()
{
int i;
for(i=0; i<10; i++) printf("%d\n", i);
}

1.2 компилируем:
Код: Выделить всё
gcc -S test.c

1.3 получаем машинный код:
Код: Выделить всё
...
        .LC0:
        .string "%d\n"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $20, %esp
        movl    $0, -8(%ebp)
        jmp     .L2
.L3:
        subl    $8, %esp
        pushl   -8(%ebp)
        pushl   $.LC0
        call    printf
        addl    $16, %esp
        incl    -8(%ebp)
.L2:
        cmpl    $9, -8(%ebp)
        jle     .L3
        movl    -4(%ebp), %ecx
        leave
        leal    -4(%ecx), %esp
        ret
...


Теперь
2.1 программу на Паскале
Код: Выделить всё
{$mode objfpc}
var i:smallint;
begin
for i:=0 to 9 do writeln(i);
end.

2.2 компилируем:
Код: Выделить всё
fpc -al test.pp

2.3 получаем машинный код:
Код: Выделить всё
...
#  [3] begin
        pushl   %ebp
.Lc3:
.Lc4:
        movl    %esp,%ebp
.Lc5:
        subl    $8,%esp
# Var i located in register si
        movl    %ebx,-8(%ebp)
        movl    %esi,-4(%ebp)
        call    FPC_INITIALIZEUNITS
        movw    $0,%si
# [4] for i:=0 to 9 do writeln(i);
        movw    $0,%si
        decw    %si
.Lj5:
        incw    %si
        call    fpc_get_output
        movl    %eax,%ebx
        movswl  %si,%ecx
        movl    %ebx,%edx
        movl    $0,%eax
        call    fpc_write_text_sint
        movl    %ebx,%eax
        call    fpc_writeln_end
        cmpw    $9,%si
        jl      .Lj5
# [5] end.
        call    FPC_DO_EXIT
        movl    -8(%ebp),%ebx
        movl    -4(%ebp),%esi
        leave
        ret
.Lc2:
.Le0:
...

Так-что для меня, пока паскалевский машинный код сравним по эффективности с сишным (хотя несколько уступает, с этим соглашусь), нет особых причин писать на Си. Только если важных API-интерфейсов будет не хватать, или нужно будет что-то крайне серьезно оптимизировать.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение Vladislav_133 18 дек 2008, 21:51

Да нет, я ведь основывался на известном тезисе:
Linux система написана C-программистами для C-программистов.
И в этом есть доля истины.
Однако по делу. В выходные все же попытаюсь найти время и напишу на C для windows.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Cкорость работы многопоточного кода в Windows и Linux

Сообщение xdsl 18 дек 2008, 23:04

Vladislav_133 писал(а):Linux система написана C-программистами для C-программистов.
Но ведь и атомная бомба создавалась для войны, а сейчас - сплошной мирный атом ;)

Чуть расширил примеры программ, приведенные в предыдущем посте и получил столь парадоксальные результаты, что решил вынести их в отдельную тему: https://shgpi.edu.ru/forum/viewtopic.php?f=15&t=17
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.


Вернуться в Алгоритмизация и программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron