- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
program Yields;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Yield in 'System.Yield.pas';
procedure ShittyRec(Yield: TYield<Integer>; depth, par1, par2: integer);
var
i: integer;
begin
Yield(par1+par2);
if depth>100 then
exit;
for i := 0 to 99 do
begin
par2 := par2*65537+1;
ShittyRec(Yield, depth+1, par1*(i+1)+par2, par2);
end
end;
function GetNextShittyInt: TYieldEnumerable<Integer>;
begin
Result := TYieldEnumerable<Integer>.Create(
procedure(Yield: TYield<Integer>)
begin
Yield(0);
ShittyRec(Yield, 0, 1, 2);
end);
end;
var
i: Integer;
begin
for i in GetNextShittyInt do
begin
Writeln(i);
end;
Readln;
end.
LispGovno 16.01.2015 01:26 # +1
kipar 16.01.2015 11:57 # +1
Вообще мне правда порвали шаблон Fiberы, на которых это сделано. Корутины из времен WinNT3.51, с минимальным оверхедом на переключение потока (я правда его не тестил, но по описанию он меньше чем у обычных потоков т.к. планировщик в нем не участвует и даже TLS не надо переключать).
bormand 16.01.2015 14:27 # 0
Т.е. хардкорный ассемблер, как в boost::coroutine?
kipar 16.01.2015 15:42 # 0
bormand 16.01.2015 15:44 # +1
http://www.boost.org/doc/libs/1_57_0/libs/context/doc/html/context/performance.html
bormand 16.01.2015 15:47 # 0
kipar 16.01.2015 15:58 # +2
guest 16.01.2015 15:59 # 0
LispGovno 16.01.2015 22:01 # 0
bormand 16.01.2015 22:02 # +1
LispGovno 16.01.2015 22:05 # +1
LispGovno 16.01.2015 22:29 # 0
guest 17.01.2015 01:36 # 0
LispGovno 17.01.2015 03:17 # 0
bormand 17.01.2015 08:19 # 0
Можно поподробнее (или даже ссылочку)?
LispGovno 17.01.2015 12:02 # +1
http://www.netbsd.org/docs/kernel/lazyfpu.html
bormand 17.01.2015 12:07 # 0
LispGovno 17.01.2015 12:12 # +1
The FPU/MMX and SSE state could be saved and reloaded, but the CPU can also be tricked into generating an exception the first time that an FPU/MMX or SSE instruction is used by copying the hardware context switch mechanism (setting the TS flag in CR0).
http://wiki.osdev.org/Context_Switching
bormand 17.01.2015 12:16 # 0
Я ленивый пиздюк.
LispGovno 17.01.2015 12:24 # 0
Stallman 17.01.2015 12:28 # +2
bormand 16.01.2015 06:40 # +3
inkanus-gray 16.01.2015 16:24 # +1
guest 16.01.2015 16:45 # +1
inkanus-gray 16.01.2015 22:05 # 0
Анонимус 16.01.2015 22:12 # +1
А вот perl, ruby и местами JS так не думает
guest 16.01.2015 16:31 # +3
inkanus-gray 16.01.2015 21:57 # +1
Анонимус 16.01.2015 22:04 # +2
bormand 16.01.2015 22:05 # +2
P.S. Но лучше для этого воткнуть какое-нибудь ожидание или блокирующую операцию. Эффект будет тот же, но тред не будут будить без повода.
LispGovno 16.01.2015 22:07 # 0
Анонимус 16.01.2015 22:10 # 0
bormand 16.01.2015 22:12 # 0
Yield нужен разве что для мягкого busy wait'а (не будем обсуждать его нинужность):
LispGovno 16.01.2015 22:16 # 0
а он нужен при реализации критических секций или при реализации локфри методов
bormand 16.01.2015 22:25 # +1
Не особо, если честно. Внутри спинлока не ставят Yield (т.к. с тем же успехом можно сразу уйти в wait), а после неудачного спинлока будет уже wait.
> бизивейтах
Мы сейчас не о обычном бизивейте (аля спинлок), а о мягком, который я показал выше.
LispGovno 16.01.2015 22:33 # 0
Анонимус 16.01.2015 22:18 # 0
LispGovno 16.01.2015 22:23 # 0
LispGovno 16.01.2015 22:10 # 0
Капитан, улыбка сделала бы ваше лицо красивее. Хотя и морщинистее.
Анонимус 16.01.2015 22:12 # 0
LispGovno 16.01.2015 22:24 # 0
Анонимус 16.01.2015 22:27 # 0
bormand 16.01.2015 22:27 # +1
LispGovno 16.01.2015 22:36 # +1
В монаду IO заверни или останови для сборки мусора.
LispGovno 16.01.2015 22:13 # 0
Похоже твой смайлик демонстрирует нам лицо подопытного:
Паскаль трёт немного эбонитовую палочку, а потом вставляет подопотному свою елду.