Здравствуйте, MaxMP, Вы писали:
MMP>Здравствуйте, =KRoN=, Вы писали:
=KR>>В целях бенчмарка считаю функцию Аккермана
MMP>Хм, и какие значения x, y (что не хватило стека)?
Да, 4, 4 уже хватило — вылетает.
Я попробовал напрямую отредактировать размер стека непосредственно в exe — увеличил немного (х16, там стоял 1 мег).
Работает: до — ~ 250тыс вызовов, после ~ пока не досчитало, но понятно, что пропорционально увеличилось. Причем по ходу дела появляются нехилые тормоза...
MMP>Я попробовал напрямую отредактировать размер стека непосредственно в exe — увеличил немного (х16, там стоял 1 мег).
Гм. У меня по смещению 0x16 — 00 00 40 00 — т.е. 4Мб.
А что до времени — на VC7 с обычными вызовами ackr(3,8,8) вычисляется за 4.07сек (P3-1200(124FSB),SDRAM), с регистровыми вызовами (/Gr, fastcall) — 2.56сек. На Ocaml 4 — 2.23сек.
Кстати, код на Ocaml тупой до безобразия (в смысле прямо один-в-один по определению):
let rec a n x y =
match (n, y) with
(0, y) -> x+1
| (1, 0) -> x
| (2, 0) -> 0
| (3, 0) -> 1
| (n, 0) -> 2
| (n, y) -> (a (n-1) (a n x (y-1)) x)
;;
print_int(a 3 8 8);
Вот теперь хочу C# прощупать На SP-Forth так пока и не нашёл, где стек увеличивать, хотя он в исходниках, Haskell (ghc) не смотря на ещё более красивый код
import System
a 0 x y = x+1
a 1 x 0 = x
a 2 x 0 = 0
a 3 x 0 = 1
a n x 0 = 2
a n x y = (a (n-1) (a n x (y-1)) x)
main = do print(a 3 8 8)
ругается, что ему хипа не хватает, мол Windows больше 256Мб не даёт. Хотя в параметрах прямо ему 1Гб указываю...
Здравствуйте, =KRoN=, Вы писали:
MMP>>Я попробовал напрямую отредактировать размер стека непосредственно в exe — увеличил немного (х16, там стоял 1 мег).
=KR>Гм. У меня по смещению 0x16 — 00 00 40 00 — т.е. 4Мб.
Это явно не то. Про PE можно почитать в 24.2.3.2 PE Header Windows NT-Specific Fields, Ecma-335 (см. в Program Files\Microsoft.NET\FrameworkSDK\Tool Developers Guide\docs\Partition II Metadata.doc). Оттуда видим, что размер стека закреплен стандартом (вот глупость) на фиксированных значениях
Stack Reserve Size Always 0x100000 (1Mb), Stack Commit Size Always 0x1000 (4Kb)