powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Бенчмарки C#, C++, Java, Delphi
25 сообщений из 265, страница 4 из 11
Бенчмарки C#, C++, Java, Delphi
    #34432637
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Заровный
Скомпилил lzma на FreePascal, кое как запустил, но результаты почти в 2 раза медленнее, чем в Delphi7.

;) А ты еще попробуй скомпилировать C++ пример на разных версиях C++ (к примеру - GNU C/C++ vs Intel C++). Будешь приятно удивлён тем фактом, как на таком убогом компиляторе миру свободного софта удается делать более производительные и менее ресурсоемкие конечные решения.. ;))))
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34433002
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhide Константин Заровный
Скомпилил lzma на FreePascal, кое как запустил, но результаты почти в 2 раза медленнее, чем в Delphi7.

;) А ты еще попробуй скомпилировать C++ пример на разных версиях C++ (к примеру - GNU C/C++ vs Intel C++). Будешь приятно удивлён тем фактом, как на таком убогом компиляторе миру свободного софта удается делать более производительные и менее ресурсоемкие конечные решения.. ;))))

чего-то я вас не понимаю. сначала вы говорите, что каомплиятор убогий, а потом - что он лучше.
похоже вы путаете компилятор со средой разработки. (ведь в стандартном виде у GCC нет его как такового)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434367
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратился за помощью к коллегам с www.delphikingdom.com , порекомендовали такую штуку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
В приведённом примере заменил for на while во внутреннем цикле
//     for kl:=d+ 1  to razmer do
//     if b[kl]<b[m] then m:= kl;
      kl:= d +  1 ;
      while kl <= razmer do begin
        if b[kl]<b[m] then m:= kl;
        Inc(kl);
      end;
Результат значительно улучшился - на Athlon XP 2000+ на исходном варианте BDS 2006 дает 2047 ms, после замены for на while - 1641 ms, но тем не менее, до скорости старых версий всё равно не дотягивает:(
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434488
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vitalekОбратился за помощью к коллегам
Интересная замена. А если еще поменять
Код: plaintext
while kl <= razmer do begin
на
Код: plaintext
while kl < razmer+ 1  do begin
и переменную kl поменять на min,
то получаем еще выигрыш (по крайней мере на Celeron 3,16ГГц)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434525
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще поменял
Код: plaintext
1.
2.
3.
      for min:=obmen+ 1  to razmer do
        if (b[min]<b[m]) and (b[min]>b[obmen]) then
          m:=min;
на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
      min:=obmen+ 1 ;
      while min<razmer+ 1  do
        begin
          if (b[min]<b[m]) and (b[min]>b[obmen]) then
            m:=min;
          inc(min);
        end;
и вплотную приблизился к D6 с циклами for:
при razmer=12
D6 - Time: 11157(ms)
D2006 - Time: 11469(ms)
Это что же получается? Плохая реализация цикла for?
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434569
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поменял все циклы for на while
Результат на D2006 - Time: 9875(ms)
Это на Celeron 3,16ГГц
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434578
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, я в шоке!!!
От первоначальных 14,8 сек получил 9,8 простой заменой for на while!!!
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434583
vlgri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще поменяй
Код: plaintext
1.
2.
3.
4.
while true do
begin
....
end;
на
Код: plaintext
1.
2.
3.
repeat
...
until false;

переменную razmer на константу и вынеси тело в процедуру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure Test;
....
begin
....
end;

begin
   Test;
end.

...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434652
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlgriЕще поменяй
Код: plaintext
1.
2.
3.
4.
while true do
begin
....
end;
на
Код: plaintext
1.
2.
3.
repeat
...
until false;

переменную razmer на константу
D2006 - Time: 8657(ms) !!!
Ну с переменной и константой понятно.
А вот вынос в процедуру затормозил до 9016.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434660
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuric74
Это что же получается? Плохая реализация цикла for?

Ситуация проясняется - оказывается в D7 Update1 в кодогенератор был внесён баг:
http://www.delphikingdom.com/asp/talktopic.asp?ID=195&ref=msg&msg=290#msg291
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434667
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitalek Yuric74
Это что же получается? Плохая реализация цикла for?

Ситуация проясняется - оказывается в D7 Update1 в кодогенератор был внесён баг:
http://www.delphikingdom.com/asp/talktopic.asp?ID=195&ref=msg&msg=290#msg291

Sorry, ссылка
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434687
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итоговый код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
program Test;
{$APPTYPE CONSOLE}
uses
  Sysutils,
  Windows;

const
  razmer:integer= 12 ;

var
  b:array[ 1 .. 20 ] of integer;
  Time1,Time2,nomvar,d,m,min,obmen:integer;
begin
  for d:= 1  to  20  do
    b[d]:=d;
  nomvar:= 0 ;
  Time1:=GetTickCount;
  repeat
    begin
      nomvar:=nomvar+ 1 ;
      m:=razmer;
      while m> 1  do
        begin
          if b[m]>b[m- 1 ] then
            break;
          dec(m);
        end;
      if m= 1  then
        Break;
      obmen:=m- 1 ;
      min:=obmen+ 1 ;
      while min<razmer+ 1  do
        begin
          if (b[min]<b[m]) and (b[min]>b[obmen]) then
            m:=min;
          inc(min);
        end;
      min:=b[obmen];
      b[obmen]:=b[m];
      b[m]:=min;
      d:=obmen+ 1 ;
      while d<razmer do
        begin
          m:=d;
          min:=d+ 1 ;
          while min<razmer+ 1  do
            begin
              if b[min]<b[m] then
                m:=min;
              Inc(min);
            end;
          min:=b[m];
          b[m]:=b[d];
          b[d]:=min;
          inc(d);
        end;
    end;
  until false;
  Time2:=GetTickCount;
  Writeln('Count: '+IntToStr(nomvar));
  Writeln('Time: '+IntToStr(Time2-Time1)+'(ms)');
  Readln;
end.
Результаты для razmer=12 на Celeron 3,16ГГц для вышеприведенного кода
D6 - Time: 8640(ms)
D2006 - Time: 8625(ms)
Все встало на свои места, паритет!!!
Приду домой, проверю на Athlon Х2 3800+
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434711
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuric74Результаты для razmer=12 на Celeron 3,16ГГц для вышеприведенного кода
D6 - Time: 8640(ms)
D2006 - Time: 8625(ms)
Все встало на свои места, паритет!!!
Приду домой, проверю на Athlon Х2 3800+

Но, согласитесь, - это ведь полумера. Совсем отказаться от использования for - не очень-то красиво.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434716
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vitalekСитуация проясняется - оказывается в D7 Update1 в кодогенератор был внесён баг
Почитал, успокоился. Буду учитывать, что при подобном коде лучше использовать while.
Кстати, в D6 скорость от замены for на while тоже повысилась.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34434723
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vitalekСовсем отказаться от использования for - не очень-то красиво.
А куда деваться при критичном ко времены выполнения коде. А совсем отказываться смысла нет. По крайней мере на моей работе точно нет смысла отказываться. У нас нет кода, настолько критичного ко времени.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435250
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuric74Итоговый код


Попробовал заменить все циклы while на repeat, получилось не только быстрее, но и компактнее за счёт изъятия begin end :) :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
program Test;

{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows;

const
  razmer:integer =  12 ;

var
  b: array[ 1 .. 20 ] of integer;
  Time1, Time2, nomvar, d, m, min, obmen: Integer;
begin
  for d:=  1  to  20  do
    b[d]:= d;
  nomvar:=  0 ;
  Time1:= GetTickCount;
  repeat
    nomvar:= nomvar+ 1 ;
    m:= razmer;
    repeat
      if b[m] > b[m- 1 ] then
        break;
      Dec(m);
    until m <=  1 ;
    if m =  1  then
      Break;
    obmen:= m- 1 ;
    min:= obmen+ 1 ;
    repeat
      if (b[min] < b[m]) and (b[min] > b[obmen]) then
        m:= min;
      Inc(min);
    until min >= razmer+ 1 ;
    min:= b[obmen];
    b[obmen]:= b[m];
    b[m]:= min;
    d:= obmen+ 1 ;
    repeat
      m:= d;
      min:= d+ 1 ;
      repeat
        if b[min] < b[m] then
          m:= min;
        Inc(min);
      until min >= razmer+ 1 ;
      min:= b[m];
      b[m]:= b[d];
      b[d]:= min;
      Inc(d);
    until d >= razmer;
  until false;
  Time2:= GetTickCount;
  Writeln('Count: '+IntToStr(nomvar));
  Writeln('Time: '+IntToStr(Time2-Time1)+'(ms)');
  Readln;
end.

Athlon XP 2000+ 1,66 ГГц
Итоговые результаты:

------------------------------Delphi 2006-------------Delphi 6

исх. тест for---------------24578 ms-------------13781 ms

замена на while---------15188 ms-------------18328 ms

замена на repeat--------13860 ms-------------13766 ms
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435343
mrDOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если еще вместо
until min >= razmer+1;
понаписать
Код: plaintext
1.
2.
3.
4.
5.
var
tmp:integer;
..
tmp:=razmer+ 1 ;
...
until min >= tmp;
то будет исчо на 1% быстрее, вне зависимости от вида цикла выражение стоящее в условии на каждой итерации вычисляется заново.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435483
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И для сравнения поэкспериментировал с FPC 2.0.2/Lazarus 0.9.14 и настройками оптимизации, которых там побольше, чем в Делфе.
Всё тот же Athlon XP 2000+ 1,66 ГГц:
Результаты по уровням оптимизации:

----------------------------------Level 1------------------Level 2-------------------Level 3

исх. тест for---------------34235 ms-------------33844 ms--------------34125 ms

замена на while---------34266 ms-------------33844 ms---------------34188 ms

замена на repeat--------34250 ms-------------33813 ms---------------34156 ms

Как видим, сильного разброса нет, но общая скорость до делфийской не тянет. По ходу, это плата за кроссплатформенность.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435490
vitalek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master Alex Yuric74Раз здесь тема про бенчмарки, спрошу:
Кто-нибудь может объяснить, почему следующий код, скомпилированный в Delphi 4,5,6 работает ровно в 2 (два) раза быстрее, чем этот же код, скомпилированный в Delphi 7 и 2006.


Sysutils напиши вот так - SysUtils и заработает на той же скорости!

Улыбнуло:)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435582
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Провел тесты на Athlon X2 3800+ (частота номинал 2ГГц) для razmer=12
Цикл for
D6 - 11156(ms)
D2006 - 21593(ms)

Цикл while
D6 - 15203(ms)
D2006 - 13219(ms)

Цикл repeat
D6 - 10094(ms)
D2006 - 10719(ms)

Прикладываю исходники и exe'шники для D6
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435583
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И исходники и exe'шники для D2006
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435595
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вдогонку тесты на D5
Цикл for - 10906(ms)
Цикл while - 14609(ms)
Цикл repeat - 10187(ms)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34435963
Доброго времени суток!

To vitalek

В целях оптимизации можно использовать нумерацию элементов массива с 0 - в этом случае m будет сравниваться не с 1, а с 0, что немного быстрее

min >= razmer+1 эквивалентно min > razmer
nomvar:= nomvar+1; - Inc(nomvar)

У меня после этих замен на D5 время выполнения уменьшилось с 17359 до 14500

С уважением, Евгений
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34437632
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузнецов ЕвгенийВ целях оптимизации можно использовать нумерацию элементов массива с 0нууу настоящие паскалисты так делать не должны :)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34438992
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поигрался в оптимизацию.
Просьба сильно не пинать :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
program D6_goto;
{$APPTYPE CONSOLE}
uses
  SysUtils, Windows;

const
  razmer:integer= 12 ;

label
  M0,M1,M3,M5,M8,M9,M11,M41,M61,M71;

var
  b:array[ 1 .. 20 ] of integer;
  Time1,Time2,nomvar,d,m,min,obmen:integer;
begin
  for d:= 1  to  20  do
    b[d]:=d;
  nomvar:= 0 ;
  Time1:=GetTickCount;
  goto M0;
M3:
    obmen:=m- 1 ;
    min:=m;
M41:
    if (b[min]>b[obmen]) and (b[min]<b[m]) then m:=min;
    Inc(min);
    if min<=razmer then goto M41;
M5:
    min:=b[obmen];
    b[obmen]:=b[m];
    b[m]:=min;
    d:=obmen+ 1 ;
    if d=razmer then goto M0;
M61:
    m:=d;
    min:=d+ 1 ;
    if min>razmer then goto M8;
M71:
    if b[min]<b[m] then m:=min;
    Inc(min);
    if min<=razmer then goto M71;
M8:
    min:=b[m];
    b[m]:=b[d];
    b[d]:=min;
    inc(d);
    if d<razmer then goto M61;
M0:
    Inc(nomvar);
    m:=razmer;
M11:
    if b[m]>b[m- 1 ] then goto M3;
    Dec(m);
    if m> 1  then goto M11;
M9:
  Time2:=GetTickCount;
  Writeln('Count: '+IntToStr(nomvar));
  Writeln('Time: '+IntToStr(Time2-Time1)+'(ms)');
  Readln;
end.
Время выполнения на Athlon X2 3800+ для razmer=12
D6 - 8031(ms)
D2006 - 8750(ms)
...
Рейтинг: 0 / 0
25 сообщений из 265, страница 4 из 11
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Бенчмарки C#, C++, Java, Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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