[image]

Мерянье пи... э... попугаями. Быстродействие языков.

 
+
-
edit
 

Balancer

администратор
★★★★★
Mishka>Кстати, здесь сразу видны накладные расходы на чисто стековую архитектуру - нет неразрушающих операций - отсюда dup многократно.


Опять же, беда Форта. Ввести CODE-блок с неразрушающим сравнением - 5 минут :) Из-за чего ничего подобного в стандарте и не предусматривают. Что-то типа (вариант для SPF4)

[/span]
CODE
Created with colorer-take5 library. Type 'forth'  CODE DUP= [color=#696969; ]( x1 x2 — x1 flag )[/color] [color=#696969; ]\ flag "истина" тогда и только тогда, когда x1 побитно равен x2.[/color]      XOR  EAX, [EBP]      SUB  EAX, # [color=#008c00; ]1[/color]      SBB  EAX, EAX       RET END-CODE 
[span class='postcolor']

И всё :) И уже нет потерь на DUP'ы в сравнениях...
Эх, хороший бы ещё оптимизатор поверх всего этого... :)
   
+
-
edit
 

Balancer

администратор
★★★★★
Ну, вот. Прислали мне решение для SP-Forth'а

Gjkexbkjcm - 2.4сек. на SPF Version 4.00 Build 009 at 10.Nov.2002
(Напомню: PIII-1200, 512RAM
VC7 - 2.6, O'Caml - 2.1сек.)

Поскольку тут время уже может зависеть от стартап-процедур, решил посчитать побольше, благо и памяти у меня теперь побольше стало - ackr(3,8,9).

O'Caml - 19сек.
SPF4 - 21сек.
VC7 - 24сек.
asm - 26сек.
C# - 27сек.
   

Lerm

втянувшийся
=KRoN=, 25.11.2002 04:48:00:
Если кто-то для теста сгенерит консольный .class для функции Аккермана для 3,8,8 - я прогоню его у себя и скажу, сколько времени он будет работать
 

Ну вот, лобовое переложение программы с C на Java:

public class Acker [color=#800080; ]{[/color]   static [color=#008484; ]int[/color] a[color=#808030; ]([/color][color=#008484; ]int[/color] n[color=#808030; ],[/color] [color=#008484; ]int[/color] x[color=#808030; ],[/color] [color=#008484; ]int[/color] y[color=#808030; ])[/color]   [color=#800080; ]{[/color]     if[color=#808030; ]([/color]n[color=#808030; ]=[/color][color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#808030; ])[/color]         return x[color=#808030; ]+[/color][color=#008c00; ]1[/color][color=#800080; ];[/color]     if[color=#808030; ]([/color]y[color=#808030; ]>[/color][color=#008c00; ]0[/color][color=#808030; ])[/color]         return a[color=#808030; ]([/color]n[color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ],[/color]a[color=#808030; ]([/color]n[color=#808030; ],[/color]x[color=#808030; ],[/color]y[color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ])[/color][color=#808030; ],[/color]x[color=#808030; ])[/color][color=#800080; ];[/color]     switch[color=#808030; ]([/color]n[color=#808030; ])[/color]     [color=#800080; ]{[/color]          case [color=#008c00; ]1[/color][color=#808030; ]:[/color]  return x[color=#800080; ];[/color]         case [color=#008c00; ]2[/color][color=#808030; ]:[/color]  return [color=#008c00; ]0[/color][color=#800080; ];[/color]         case [color=#008c00; ]3[/color][color=#808030; ]:[/color]  return [color=#008c00; ]1[/color][color=#800080; ];[/color]     [color=#800080; ]}[/color]     return [color=#008c00; ]2[/color][color=#800080; ];[/color]   [color=#800080; ]}[/color]   public static [color=#008484; ]void[/color] main[color=#808030; ]([/color][color=#008484; ]String[/color][color=#808030; ][[/color][color=#808030; ]][/color] args[color=#808030; ])[/color]   [color=#800080; ]{[/color]     [color=#008484; ]System[/color][color=#808030; ].[/color]out[color=#808030; ].[/color]println[color=#808030; ]([/color]a[color=#808030; ]([/color][color=#008c00; ]3[/color][color=#808030; ],[/color][color=#008c00; ]8[/color][color=#808030; ],[/color][color=#008c00; ]8[/color][color=#808030; ])[/color][color=#808030; ])[/color][color=#800080; ];[/color]   [color=#800080; ]}[/color] [color=#800080; ]}[/color]
Created with colorer-take5 library. Type 'java'
Прикреплённые файлы:
 
   
Это сообщение редактировалось 16.12.2003 в 16:12
+
-
edit
 

Balancer

администратор
★★★★★
Спасиб, но для Java я давно уж поставил себе jdk и сам скомпилил. Только не написал в этот топик. Но, вот стека не хватает, а как указать размер стека мегабайт в 400 - не знаю
   

Lerm

втянувшийся
Balancer, 14.08.2003 10:39:33:
Спасиб, но для Java я давно уж поставил себе jdk и сам скомпилил. Только не написал в этот топик. Но, вот стека не хватает, а как указать размер стека мегабайт в 400 - не знаю
 

-Xss400M
   
+
-
edit
 

Balancer

администратор
★★★★★
Не вышло. При 400М говорит, что не может столько памяти выделить (гонит) при 200М - падает с ошибкой java.exe, при 150М - памяти не хватает.
   
+
-
edit
 

trainer

опытный

А если на MSVC в таком виде?
[QUOTE]#include //-----------------------------------------------------------------
int __fastcall a(register int n, register int x, register int y) {
   return n?(y?a(n-1,a(n,x,y-1),x):(n==1)?x:((n>3)?2:(n-2))):(x+1);
}
//-----------------------------------------------------------------
int main(int argc, char* argv[]) {
   int result = a(3,8,8);
   printf("%d\n",result);
   return 0;
}
//-----------------------------------------------------------------
[/QUOTE]У меня на Celeron 566/RAM 192MB MSVC6+IntelCPP6 дает 11 секунд. Тогда как Ваш вариант - 21 секунду.
P.S. Не ради мерянья, просто интересно.
   
+
-
edit
 

Balancer

администратор
★★★★★
trainer, 14.02.2004 14:16:12:
А если на MSVC в таком виде?
 

3.7 сек против 2.9 у O'Caml (цифры немного иные, чем раньше, потому что система поменялась, например, разгон снял из-за перегрева в LockOn).

Кроме того, опять повторюсь на тему синатксиса.
[color=#808030; ]let[/color] rec a n x y [color=#808030; ]=[/color]     match [color=#808030; ]([/color]n[color=#808030; ],[/color] y[color=#808030; ])[/color] with         [color=#808030; ]([/color][color=#008c00; ]0[/color][color=#808030; ],[/color] y[color=#808030; ])[/color] [color=#808030; ]->[/color] x[color=#808030; ]+[/color][color=#008c00; ]1[/color]       [color=#808030; ]|[/color] [color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ],[/color] [color=#008c00; ]0[/color][color=#808030; ])[/color] [color=#808030; ]->[/color] x       [color=#808030; ]|[/color] [color=#808030; ]([/color][color=#008c00; ]2[/color][color=#808030; ],[/color] [color=#008c00; ]0[/color][color=#808030; ])[/color] [color=#808030; ]->[/color] [color=#008c00; ]0[/color]       [color=#808030; ]|[/color] [color=#808030; ]([/color][color=#008c00; ]3[/color][color=#808030; ],[/color] [color=#008c00; ]0[/color][color=#808030; ])[/color] [color=#808030; ]->[/color] [color=#008c00; ]1[/color]       [color=#808030; ]|[/color] [color=#808030; ]([/color]n[color=#808030; ],[/color] [color=#008c00; ]0[/color][color=#808030; ])[/color] [color=#808030; ]->[/color] [color=#008c00; ]2[/color]       [color=#808030; ]|[/color] [color=#808030; ]([/color]n[color=#808030; ],[/color] y[color=#808030; ])[/color] [color=#808030; ]->[/color] [color=#808030; ]([/color]a [color=#808030; ]([/color]n[color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ])[/color] [color=#808030; ]([/color]a n x [color=#808030; ]([/color]y[color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ])[/color][color=#808030; ])[/color] x[color=#808030; ])[/color]     [color=#808030; ];[/color][color=#808030; ];[/color] print[color=#808030; ]_[/color]int[color=#808030; ]([/color]a [color=#008c00; ]3[/color] [color=#008c00; ]8[/color] [color=#008c00; ]8[/color][color=#808030; ])[/color][color=#808030; ];[/color]
Created with colorer-take5 library. Type 'sml'


Так оно гораздо нагляднее, чем на Си
   
+
-
edit
 

Balancer

администратор
★★★★★
trainer, 14.02.2004 14:16:12:
дает 11 секунд. Тогда как Ваш вариант - 21 секунду.
 

Я так понимаю, что мой вариант ты компилил без ключей регистровой оптимизации. Т.к. у меня мой вариант выдаёт 3.8сек. 0.1 секунду можно списать на погрешности измерения (хотя я делал по 5 запусков и брал лучший результат).

cl /Ox /O2 /F327680000 /Fa /FAsc /G6 /Gr ackerman.c
   
+
-
edit
 

Jameson

опытный

Пытался тут заценить быстродействие проги в Дельфи 7, и потом в Дельфи 8 NET
До 8 еще не дошел, т.к., похоже, неправильно перевел на дельфи прогу, скажите, она должна выдать 0? дело в том, что вы тут пишете про огромные значения стека, а у меня 16мегабайт хватило. Может, дело в размере int, какого он размера? Когда я делал integer, а в дельфи 7 оно 32 бита, то максимального стека не хватало.. Сделал smallint, там 2 байта. И время выполнения - 0 получаеться. Как бы поточнее его измерить? А то с атлоном 2100+ похоже, сильно быстро получается.
   

Rada

опытный

2 Jameson: используешь GetTickCount() небось? Для очень маленьких интервалов используй QueryPerformaneCounter и QueryPerformanceFrequency. За описанием смотри в http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/queryperformancecounter.asp.
   
+
-
edit
 

Rada

опытный

2 Jameson: как импортировать функции из ядра прямо в .NET (C#, VB.NET) смотри http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncfhowto/html/uperfcoun.asp.
   
+
-
edit
 

Balancer

администратор
★★★★★
Jameson, 01.03.2004 05:29:43 :
скажите, она должна выдать 0?
 


ackr(3,8,8)=16777216

>дело в том, что вы тут пишете про огромные значения стека, а у меня 16мегабайт хватило.

Никак не хватит :)

>Может, дело в размере int, какого он размера?

Меньше, чем в 32 бита число не влезет.

>Когда я делал integer, а в дельфи 7 оно 32 бита, то максимального стека не хватало.. Сделал smallint, там 2 байта.

В какой-то момент он переполняется и обнуляется. А дальше уже и стека не нужно :)

>И время выполнения - 0 получаеться. Как бы поточнее его измерить? А то с атлоном 2100+ похоже, сильно быстро получается.

Ну, на цифры смотри выше :) И для 3,8,9 в т.ч.
   
+
-
edit
 

Jameson

опытный

Вот черт, похоже, обламываюсь, и в дельфи 8 не сделать стек больше 16 мегабайт..
   
+
-
edit
 

Balancer

администратор
★★★★★
Jameson, 01.03.2004 17:32:51 :
Вот черт, похоже, обламываюсь, и в дельфи 8 не сделать стек больше 16 мегабайт..
 


Попробуй ручками в EXE-шнике:
Обычные смещения - 0x0e0 (Reserve) и 0x0e4 (Commit).

На C# это
000000E0: 00 00 00 18│00 10 00 00

По умолчанию бывает
Stack Reserve Size Always 0x100000 (1Mb)
Stack Commit Size Always 0x1000 (4Kb)
   
+
-
edit
 

Jameson

опытный

У меня там нули.. :blink: А нет ли утилитки, чтобы определять отличие двух файлов, и смещение выдавать?
   
+
-
edit
 

Balancer

администратор
★★★★★
Jameson, 01.03.2004 17:57:08 :
У меня там нули.. :blink:
 


Гм. Быть того не может :)

>А нет ли утилитки, чтобы определять отличие двух файлов, и смещение выдавать?

code text
  1. >fc /?
  2. Compares two files or sets of files and displays the differences between
  3. them
  4.  
  5.  
  6. FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
  7.    [drive1:][path1]filename1 [drive2:][path2]filename2
  8. FC /B [drive1:][path1]filename1 [drive2:][path2]filename2
  9.  
  10.   /A         Displays only first and last lines for each set of differences.
  11.   /B         Performs a binary comparison.
  12.   /C         Disregards the case of letters.
  13.   /L         Compares files as ASCII text.
  14.   /LBn       Sets the maximum consecutive mismatches to the specified
  15.              number of lines.
  16.   /N         Displays the line numbers on an ASCII comparison.
  17.   /OFF[LINE] Do not skip files with offline attribute set.
  18.   /T         Does not expand tabs to spaces.
  19.   /U         Compare files as UNICODE text files.
  20.   /W         Compresses white space (tabs and spaces) for comparison.
  21.   /nnnn      Specifies the number of consecutive lines that must match
  22.              after a mismatch.
  23.   [drive1:][path1]filename1
  24.              Specifies the first file or set of files to compare.
  25.   [drive2:][path2]filename2
  26.              Specifies the second file or set of files to compare.


:)

Т.е. тебе fc /b надо
   
+
-
edit
 

sibnick

новичок
Balancer>Не вышло. При 400М говорит, что не может столько памяти выделить (гонит) при 200М - падает с ошибкой java.exe, при 150М - памяти не хватает.[»]

Не совсем гонит :)
На каждый тред резервируется эта память. Поскольку там при старте сразу несколько тредов поднимается то 400Мб сразу отваливается по нехватке памяти. Скорее всего за 2Гига уходит. Другой прикол в том что этот параметр похоже не влияет на тред в котором маин исполняется :) Он всегда исполняется с дефолтным значением. Поэтому нужно писать что-то типа:
code java
  1. public class Acker
  2. {
  3.   static int a(int n, int x, int y)
  4.   {
  5.     if(n==0)
  6.         return x+1;
  7.  
  8.     if(y>0)
  9.         return a(n-1,a(n,x,y-1),x);
  10.  
  11.     switch(n)
  12.     {
  13.         case 1:  return x;
  14.         case 2:  return 0;
  15.         case 3:  return 1;
  16.     }
  17.  
  18.     return 2;
  19.   }
  20.  
  21.   public static void main(String[] args)
  22.   {
  23.         Runnable r = new Runnable(){
  24.         public void run(){
  25.                 System.out.println(a(3,8,8));
  26.                 System.exit(0);  
  27.                 }
  28.         };
  29.         (new Thread(r)).start();
  30.   }
  31. }


Плюс в разных версиях явы скорость сильно отличается. Санавская ява идет в двух версиях: серверной и клиентской. Серверная у меня в три раза быстрее работает и памяти на стэки меньше просит.
Запускать так:
java -client -Xss150M -cp . Acker (-client дефолтный можно и не указывать)
или
java -server -Xss40M -cp . Acker
   
Это сообщение редактировалось 09.09.2004 в 14:02
+
-
edit
 

Balancer

администратор
★★★★★
Ок, попробую. Что же до скорости - то на JRE с их сайта на числах Фибоначчи получилась вполне приличная скорость, сопоставимая с нативным кодом. См. результаты то ли в этом, то ли в каком-то параллельном топике.
   

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru