Advertisement
Guest User

Untitled

a guest
Mar 7th, 2019
516
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.86 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import sys
  4. import os
  5. import subprocess
  6. import re
  7. from collections import namedtuple
  8. import argparse
  9.  
  10. factorio_bin = "/home/redacted/factorio/versions/0.17.6/bin/x64/factorio"
  11. factorio_config = (sys.path[0] or os.getcwd()) + "/benchconf.ini"
  12. factorio_moddir = (sys.path[0] or os.getcwd()) + "/bench-moddir"
  13.  
  14. headless_bin = "/home/redacted/factorio/versions/0.17.6-headless/bin/x64/factorio"
  15.  
  16. def run_benchmark(save_file_name, ticks, headless=False):
  17.     """
  18.    Get a benchmark Result(avg, min, max) ms per update.
  19.    """
  20.     if headless:
  21.         command = [ headless_bin,
  22.                     "--mod-directory", factorio_moddir,
  23.                     "--benchmark", save_file_name,
  24.                     "--benchmark-ticks", str(ticks)]
  25.     else:
  26.         command = [ factorio_bin,
  27.                     "--disable-audio",
  28.                     "--config", factorio_config,
  29.                     "--mod-directory", factorio_moddir,
  30.                     "--benchmark", save_file_name,
  31.                     "--benchmark-ticks", str(ticks) ]
  32.     try:
  33.         result_str = subprocess.check_output(command).decode()
  34.     except subprocess.CalledProcessError as e:
  35.         print(e.output.decode())
  36.         exit(e.returncode)
  37.     #total time
  38.     match = re.search('Performed \d+ updates in (\d+\.\d+) ms', result_str)
  39.     total = float(match.group(1))
  40.     #statistics
  41.     match = re.search(
  42.             "avg: (\d+\.\d+) ms, min: (\d+\.\d+) ms, max: (\d+\.\d+) ms",
  43.             result_str)
  44.     avg, low, high = (float(s) for s in match.groups())
  45.     #result
  46.     return namedtuple("Result", ["total", "avg", "min", "max"])(
  47.             total, avg, low, high)
  48.  
  49. def best_of_n(save_file_name, ticks, n_runs, headless=False):
  50.     results = [run_benchmark(save_file_name, ticks, headless)
  51.             for i in range(n_runs)]
  52.     results.sort()
  53.     return results[0]
  54.  
  55. def pretty_format_result(result):
  56.     fraction_realtime = 1000/60/result.avg
  57.     return "{:7.3f} × realtime, avg={:.3f} min={:.3f} max={:.3f}".format(
  58.             fraction_realtime, result.avg, result.min, result.max)
  59.  
  60. def main():
  61.     parser = argparse.ArgumentParser(
  62.             description="Benchmark factorio save files",
  63.             formatter_class=argparse.ArgumentDefaultsHelpFormatter)
  64.     parser.add_argument("file", type=str, help="save file name")
  65.     parser.add_argument("--ticks",
  66.             type=int, metavar="M", default=1800, help="length of benchmark")
  67.     parser.add_argument("--best-of",
  68.             type=int, metavar="N", default=3, help="best of N runs")
  69.     parser.add_argument("--headless",
  70.             action="store_true", help="use the headless binary")
  71.     args = parser.parse_args()
  72.     result = best_of_n(args.file, args.ticks, args.best_of, args.headless)
  73.     print(args.file + ": " + pretty_format_result(result))
  74.    
  75. if __name__ == "__main__":
  76.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement