protected double runPrecompileBenchmark(final Bytes arg, final PrecompiledContract contract) {
    if (contract.computePrecompile(arg, fakeFrame).output() == null) {
      throw new RuntimeException("Input is Invalid");
    }

    final Stopwatch timer = Stopwatch.createStarted();
    for (int i = 0; i < warmup && timer.elapsed().getSeconds() < 1; i++) {
      contract.computePrecompile(arg, fakeFrame);
    }
    timer.reset();
    timer.start();
    int executions = 0;
    while (executions < iterations && timer.elapsed().getSeconds() < 1) {
      contract.computePrecompile(arg, fakeFrame);
      executions++;
    }
    timer.stop();

    if (executions > 0) {
      final double elapsed = timer.elapsed(TimeUnit.NANOSECONDS) / 1.0e9D;
      return elapsed / executions;
    } else {
      return Double.NaN;
    }
  }
Run the benchmark with the specific args. Execution will be done warmup + iterations times

@param arg the bytes arguments to pass into the contract
@param contract the precompiled contract to benchmark
@return the mean number of seconds each timed iteration took.
ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/benchmarks/BenchmarkExecutor.java