docs: public void throttle(boolean verbose)
      {
          // Observe latency to adjust the rate to reach target latency
          if (System.currentTimeMillis() - this.LastCheck > 5000l)
          {
              if (this.End.getExecutionCount()-this.Start.getExecutionCount() > 0)
              {
                  double observedLatency = (double)(this.End.getTotalExecutionDuration()-this.Start.getTotalExecutionDuration())/(double)(this.End.getExecutionCount()-this.Start.getExecutionCount());
                  double tuningLatency = observedLatency;
                  long[] el = this.End.getLatencyBuckets();
                  long[] sl = this.Start.getLatencyBuckets();
                  long ec = this.End.getExecutionCount()-this.Start.getExecutionCount();
  
                  long elsum = 0;
                  for (int i = 0; i < 25; i++) {
                      elsum += el[i];
                  }
  
                  long slsum = 0;
                  for (int i = 0; i < 25; i++) {
                      slsum += sl[i];
                  }
  
                  // If most (97%) requests are below 25ms, fudge out observed latency to remove accidental outliers that would cause too much oscillation in latency targetting
                  if (((double)(elsum-slsum)/(double)ec) > 0.97)
                  {
                      long outlierExecutionDuration = 0;
                      long outlierExecutionCount = 0;
                      for(int i=25;i<109;i++)
                      {
                          outlierExecutionCount += (el[i]-sl[i]);
                          // buckets over 99 cover 50ms each
                          if (i >= 100)
                              outlierExecutionDuration += (el[i]-sl[i])*50l;
                          else
                              outlierExecutionDuration += (el[i]-sl[i]);
                      }
                      tuningLatency = (double)(this.End.getTotalExecutionDuration()-this.Start.getTotalExecutionDuration()-outlierExecutionDuration)/(double)(this.End.getExecutionCount()-this.Start.getExecutionCount()-outlierExecutionCount);
                  }
  
                  long oldRate = this.Rate;
                  if (tuningLatency > this.TargetLatency*2.0)
                      this.Rate = (long)(this.Rate*0.8);
                  else if (tuningLatency > this.TargetLatency*1.25)
                      this.Rate = (long)(this.Rate*0.95);
                  else if (tuningLatency > this.TargetLatency*1.1)
                      this.Rate = (long)(this.Rate*0.999);
                  else if (tuningLatency < this.TargetLatency*0.5)
                      this.Rate = (long)(this.Rate*1.1);
                  else if (tuningLatency < this.TargetLatency*0.75)
                      this.Rate = (long)(this.Rate*1.01);
                  else if (tuningLatency < this.TargetLatency*0.9)
                      this.Rate = (long)(this.Rate*1.001);
  
                  if (verbose && oldRate != this.Rate)
                      System.out.printf(
                        "%8s | Adjusting %s to:  %,11.1f TPS | Recent Latency :  %7.2f\n"
                      , this.DateFormat.format(new Date(Math.round((System.currentTimeMillis()-this.StartTime)/1000d)*1000l))
                      , (oldRate < this.Rate ? " UP " : "DOWN")
                      , (double)this.Rate
                      , tuningLatency
                      );
              }
              this.Start = (PerfCounter)this.End.clone();
              this.End = ClientConnectionPool.getStatistics(this.Connection).get(this.Procedure);
              this.LastCheck = System.currentTimeMillis();
          }
          this.Limiter.throttle(this.Rate);
      }