anchor.diff:                  "list starting from:     ~p\n"
                   "offset:                 ~p\n"
                   "limit:                  ~p\n"
  -                "time:                   ~p [us]\n"
  -                "lists per us:           ~p\n"
  +                "time:                   ~p [ms]\n"
  +                "lists per ms:           ~p\n"
                       , [ProcNum, ProcRepeats, AppendSize, MaxEntriesPerNode, SizePruningThreshold, AgePruningThreshold,
                           ListDirection, ListStartFrom, ListOffset, ListLimit,
  -                        Time, ProcNum * ProcRepeats / Time])
  +                        Time / 1000, 1000 * ProcNum * ProcRepeats / Time])
               end, MaxEntriesPerNodeList)
           end, AgePruningThresholdList)
       end, SizePruningThresholdList).
  
positive.code: 
  perform_parallel_lists(Worker, LogId, ListOpts, AccessMode, ProcRepeats, ProcNum) ->
      Self = self(),
      Pids = [spawn_link(Worker, fun() ->
          Stopwatch = stopwatch:start(),
          perform_lists(Worker, LogId, ListOpts, AccessMode, ProcRepeats),
          Self ! {self(), {ok, stopwatch:read_micros(Stopwatch)}}
      end) || _ <- lists:seq(1, ProcNum)],
      Responses = [receive {Pid, Resp} -> Resp end || Pid <- Pids],
  
      lists:foldl(fun({ok, Time}, TimeAcc) ->
          Time + TimeAcc
      end, 0, Responses).
  
negative.code:                 "max entries per node:   ~p\n"
                  "size pruning threshold: ~p\n"
                  "age pruning threshold:  ~p\n"
                  "time:                   ~p [ms]\n"
                  "appends per ms:         ~p"
                      , [ProcNum, ProcRepeats, AppendSize, MaxEntriesPerNode, SizePruningThreshold, AgePruningThreshold,
                          Time / 1000, 1000 * ProcNum * ProcRepeats / Time])
              end, MaxEntriesPerNodeList)
          end, AgePruningThresholdList)
      end, SizePruningThresholdList).
  