anchor.diff:                          k_times_spawn(Body, WorkerProvider, Iterator, Env, Step, State2, Done, Batch)
                   end,
               BatchEnd = msnow(),
  -            NewBatch = batch_size(BatchEnd - BatchStart, GotTime, NeedToSleep, Batch),
  -
  -            timerun(Start, TimeFun, NewRate, Body, WorkerProvider, Env, Opts, NewBatch, NextState, Done + Step*Batch)
  +            NewBatch = case IsFirst of
  +                true -> Batch;
  +                false -> batch_size(BatchEnd - BatchStart, GotTime, NeedToSleep, Batch)
  +            end,
  +
  +            timerun(Start, Shift, TimeFun, NewRate, Body, WorkerProvider, Env, false, Opts, NewBatch, NextState, Done + Step*Batch)
       end.
   
   eval_rates(#const_rate{rate_fun = F, value = Prev} = RateState, Done, CurTime, _Time, State) ->
  
positive.code:             {Prev, _} -> Done;
              {undefined, _} -> Done;
              {New, 0} -> round(New * CurTime / 1000);
              {New, undefined} -> round(New * CurTime / 1000);
              {New, _} -> round(New * CurTime / 1000)
          end,
      {RateState#const_rate{value = Rate}, NewDone, State1};
  
negative.code:     end.
  
  looprun(TimeFun, Rate, Body, WorkerProvider, State, Env, Opts = #opts{parallel = 1})  ->
      timerun(msnow(), random:uniform(), TimeFun, Rate, Body, WorkerProvider, Env, true, Opts, 1, State, 0);
  looprun(TimeFun, Rate, Body, WorkerProvider, State, Env, Opts = #opts{parallel = N}) ->
      StartTime = msnow(),
      _ = mzb_lists:pmap(fun (I) ->
          _ = random:seed(now()),
          timerun(StartTime, random:uniform(), TimeFun, Rate, Body, WorkerProvider, Env, true, Opts, 1, State, I)
      end, lists:seq(0, N - 1)),
      {nil, State}.
  
  timerun(Start, Shift, TimeFun, Rate, Body, WorkerProvider, Env, IsFirst, Opts, Batch, State, OldDone) ->
      LocalTime = msnow() - Start,
      {Time, State1} = TimeFun(State),
      {NewRate, Done, State2} = eval_rates(Rate, OldDone, LocalTime, Time, State1),
      ShouldBe = time_of_next_iteration(NewRate, Time, Done + Shift),
  
      Remain = round(ShouldBe) - LocalTime,
      GotTime = round(Time) - LocalTime,
  