benchplot.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/usr/bin/env python
  2. import argparse # for ArgumentParser
  3. import subprocess # for Popen
  4. import tempfile # for NamedTemporaryFile
  5. import os # for remove
  6. class gnuplot(object):
  7. output = "result.png"
  8. script = """
  9. set terminal png size 1024, 768
  10. set output "{}.png"
  11. set title "re2 benchlog"
  12. set datafile separator ";"
  13. set grid x y
  14. set ylabel "MB/s"
  15. set autoscale
  16. plot """
  17. template = """'{}' using 1:5:xticlabels(2) with linespoints linewidth 3 title "{}",\\\n"""
  18. benchdata = dict()
  19. tempfiles = []
  20. def __enter__(self):
  21. return self
  22. def __exit__(self, type, value, traceback):
  23. """
  24. remove all temporary files
  25. """
  26. for filename in self.tempfiles:
  27. os.remove(filename)
  28. def parse_re2_benchlog(self, filename):
  29. """
  30. parse the input benchlog and return a dictionary contain bench data
  31. """
  32. benchdata = self.benchdata
  33. with open(filename) as f:
  34. for raw in f.readlines():
  35. data = raw.split('\t')
  36. if len(data) == 4:
  37. data = data[0].split('/') + data[1:]
  38. data = list(map(str.strip, data))
  39. if not benchdata.get(data[0]):
  40. benchdata[data[0]] = [ data[1:] ]
  41. else:
  42. benchdata[data[0]].append(data[1:])
  43. def gen_csv(self):
  44. """
  45. generate temporary csv files
  46. """
  47. for name, data in self.benchdata.items():
  48. with tempfile.NamedTemporaryFile(delete=False) as f:
  49. for index, line in enumerate(data):
  50. f.write('{};{}\n'.format(index, ';'.join(line)).encode())
  51. self.tempfiles.append(f.name)
  52. self.script = self.script + self.template.format(f.name, name)
  53. def run(self):
  54. self.gen_csv()
  55. script = self.script[:-3].format(self.output)
  56. command = subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
  57. command.communicate(script.encode())
  58. if __name__ == '__main__':
  59. parser = argparse.ArgumentParser(description='generate plots for benchlog')
  60. parser.add_argument('benchlog', type=str, help='benchlog generated by re2')
  61. args = parser.parse_args()
  62. try:
  63. subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
  64. except FileNotFoundError:
  65. print('you can install "gnuplot" to generate plots automatically')
  66. exit(1)
  67. with gnuplot() as plot:
  68. plot.output = args.benchlog
  69. plot.parse_re2_benchlog(args.benchlog)
  70. plot.run()