slesh
21.04.2009, 19:50
некоторым из нас инода приходилось использовать альтернативные системные модули для Delphi (sysinit и system).
Кто незнает для чего они, то отвечаю - с помощью их можно очень сильно уменьшить размер программы написанных без VCL. Порядком в 2 раза уменьшается минимальное приложение.
program test;
{$APPTYPE CONSOLE}
begin
writeln('hello');
end.
Весит 7 кил. Со стандартными модулями - 15 кил.
Так что использовать их выгодно.
В инете очень часто встречаются эти модули.
Но случайно был замечен в них один глюк.
Глюк связан с генератором случайных чисел.
к функции random притензий нет. А вот randomize была жестоко убита.
Т.е. randomize задает начальное состояние ГСЧ.
Фактически эта функция заносит значение системного времяни в переменную RandSeed
Но в альтернативных модулях походу дела это значение статическое.
т.е.
for y:=1 to 10 do
begin
randomize;
for x:=1 to 10 do write(random(10));
writeln;
end;
Даст 10 одинаковых строк.
Чтобы избавиться от этого глюка достаточно самому задать значение RandSeed.
Чтобы сильно не увеличивать размер функцией получения времяни, для инициализации будим использовать количество тактов сделаннх процессором после ребута/включения.
Сделать это можно просто:
procedure myrandomize;assembler;
asm
rdtsc
add eax,edx
mov RandSeed,eax
end;
P.S. Из-за этого гюкнутового randomize стока хрени херовой было.
Кто незнает для чего они, то отвечаю - с помощью их можно очень сильно уменьшить размер программы написанных без VCL. Порядком в 2 раза уменьшается минимальное приложение.
program test;
{$APPTYPE CONSOLE}
begin
writeln('hello');
end.
Весит 7 кил. Со стандартными модулями - 15 кил.
Так что использовать их выгодно.
В инете очень часто встречаются эти модули.
Но случайно был замечен в них один глюк.
Глюк связан с генератором случайных чисел.
к функции random притензий нет. А вот randomize была жестоко убита.
Т.е. randomize задает начальное состояние ГСЧ.
Фактически эта функция заносит значение системного времяни в переменную RandSeed
Но в альтернативных модулях походу дела это значение статическое.
т.е.
for y:=1 to 10 do
begin
randomize;
for x:=1 to 10 do write(random(10));
writeln;
end;
Даст 10 одинаковых строк.
Чтобы избавиться от этого глюка достаточно самому задать значение RandSeed.
Чтобы сильно не увеличивать размер функцией получения времяни, для инициализации будим использовать количество тактов сделаннх процессором после ребута/включения.
Сделать это можно просто:
procedure myrandomize;assembler;
asm
rdtsc
add eax,edx
mov RandSeed,eax
end;
P.S. Из-за этого гюкнутового randomize стока хрени херовой было.