Как увеличить размер стека в C#?
От: KRoN Россия http://balancer.da.ru
Дата: 16.11.02 13:05
Оценка:
Перерыл MSDN, Гугль — ничего не нашёл. Где копать?
...Глубина-глубина, я не твой...
Re: Как увеличить размер стека в C#?
От: MaxMP Россия  
Дата: 16.11.02 13:32
Оценка:
Здравствуйте, KRoN, Вы писали:

KRN>Перерыл MSDN, Гугль — ничего не нашёл. Где копать?


А нафиг (если не секрет)?
Re[2]: Как увеличить размер стека в C#?
От: =KRoN= Россия http://balancer.da.ru
Дата: 16.11.02 13:34
Оценка:
MMP>А нафиг (если не секрет)?

В целях бенчмарка считаю функцию Аккермана
...Глубина-глубина, я не твой...
Re[3]: Как увеличить размер стека в C#?
От: MaxMP Россия  
Дата: 16.11.02 13:56
Оценка:
Здравствуйте, =KRoN=, Вы писали:

=KR>В целях бенчмарка считаю функцию Аккермана

Хм, и какие значения x, y (что не хватило стека)?
Re[4]: Как увеличить размер стека в C#?
От: =KRoN= Россия http://balancer.da.ru
Дата: 16.11.02 14:24
Оценка:
MMP>Хм, и какие значения x, y (что не хватило стека)?

Я не двухпараметрическую, а трёхпараметрическую функцию мучаю.

using System;

class ackr
{
    static int a(int n, int x, int y)
    { 
        if(n==0) 
            return x+1;

        if(y!=0)
            return a(n-1,a(n,x,y-1),x);

        switch(n)
        { 
            case 1:  return x;
            case 2:  return 0;
            case 3:  return 1;
        }

        return 2;
    }

    static void Main(string[] args)
    {
        Console.Write(a(3,8,8));
    }

}


На MSVC++7 заработало начиная с размера стека 327680000 байт (дописывал нулики, пока не хватило), на Ocaml 4 — 32768000 байт.
...Глубина-глубина, я не твой...
Re[4]: Как увеличить размер стека в C#?
От: MaxMP Россия  
Дата: 16.11.02 14:37
Оценка:
Здравствуйте, MaxMP, Вы писали:

MMP>Здравствуйте, =KRoN=, Вы писали:


=KR>>В целях бенчмарка считаю функцию Аккермана

MMP>Хм, и какие значения x, y (что не хватило стека)?


Да, 4, 4 уже хватило — вылетает.
Я попробовал напрямую отредактировать размер стека непосредственно в exe — увеличил немного (х16, там стоял 1 мег).
Работает: до — ~ 250тыс вызовов, после ~ пока не досчитало, но понятно, что пропорционально увеличилось. Причем по ходу дела появляются нехилые тормоза...
Re[5]: Как увеличить размер стека в C#?
От: =KRoN= Россия http://balancer.da.ru
Дата: 16.11.02 14:56
Оценка:
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Гб указываю...
...Глубина-глубина, я не твой...
Re[6]: Как увеличить размер стека в C#?
От: MaxMP Россия  
Дата: 16.11.02 15:34
Оценка:
Здравствуйте, =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)
Re[7]: Как увеличить размер стека в C#?
От: MaxMP Россия  
Дата: 16.11.02 15:45
Оценка:
Здравствуйте, MaxMP, Вы писали:

=KR>>Гм. У меня по смещению 0x16 — 00 00 40 00 — т.е. 4Мб.

x16 — в смысле не смещения, а увеличения в 16 раз. Обычные смещения — 0x0e1 (Reserve) и 0x0e5 (Commit).
Re[8]: Как увеличить размер стека в C#?
От: MaxMP Россия  
Дата: 16.11.02 15:58
Оценка:
MMP>x16 — в смысле не смещения, а увеличения в 16 раз. Обычные смещения — 0x0e1 (Reserve) и 0x0e5 (Commit).

Тпфу, не 0xe1/0xe5, а 0x0e0, 0x0e4.
Re[9]: Как увеличить размер стека в C#?
От: =KRoN= Россия http://balancer.da.ru
Дата: 16.11.02 17:00
Оценка:
MMP>>x16 — в смысле не смещения, а увеличения в 16 раз. Обычные смещения — 0x0e1 (Reserve) и 0x0e5 (Commit).
MMP>Тпфу, не 0xe1/0xe5, а 0x0e0, 0x0e4.

Ага, спасибо, всё завелось и сработало

Цитирую себя же:
>Есть. C# после ручного копания заголовка EXE-шника (спасибо MaxMP
Автор: KRoN
Дата: 16.11.02
) дал результат 3.96сек. По-моему очень и очень неплохо! У C#, думаю, есть все шансы потеснить C++ и, тем более, Java/VB.
...Глубина-глубина, я не твой...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.