batchplotter.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/usr/bin/env python3
  2. # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
  3. import json
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import os
  7. import sys
  8. from subprocess import Popen, PIPE
  9. from stats import parseData
  10. bar_width = 0.25
  11. index = []
  12. def plot(process_data):
  13. fig, ax = plt.subplots(figsize=(10,5))
  14. task_output = []
  15. for p in process_data:
  16. cmd = ["./simusched",p["tasks"]]
  17. cmd.extend(p["args"].split(" "))
  18. process = Popen(cmd, stdout=PIPE)
  19. (out, _) = process.communicate()
  20. process.wait()
  21. out = out.decode("utf-8")
  22. parsed = parseData(out.split("\n"))
  23. ap = {}
  24. ap["processes"] = parsed
  25. ap["tasks"] = p["tasks"]
  26. ap["args"] = p["args"]
  27. task_output.append(ap)
  28. m_latencies = []
  29. m_ready = []
  30. m_cpu = []
  31. m_cpuio = []
  32. for t in task_output:
  33. m_latencies.append(meanLatency(t))
  34. m_ready.append(meanReady(t))
  35. m_cpu.append(meanCPU(t))
  36. m_cpuio.append(meanCPUIO(t))
  37. plot_data(0, m_latencies, 'r', 'M. Latency')
  38. plot_data(1, m_ready, 'g', 'M. Ready')
  39. plot_data(2, m_cpu, 'b', 'M. CPU')
  40. plot_data(3, m_cpuio, '#deadbe', 'M. CPU+IO')
  41. ax.set_ylabel('Time')
  42. ax.set_title('title')
  43. ax.set_xticks([ i + 1.5 * bar_width for i in index])
  44. ax.set_xticklabels( ["%s %s" % (task_output[i]["tasks"], task_output[i]["args"])
  45. for i in range(len(process_data))])
  46. for tick in ax.xaxis.get_major_ticks():
  47. tick.label.set_fontsize(9)
  48. plt.legend()
  49. plt.tight_layout()
  50. plt.grid()
  51. filename='out.png'
  52. plt.savefig(filename)
  53. print("salida: %s" % filename)
  54. def meanLatency(pl):
  55. totLatency = sum([ latency(p) for p in pl["processes"]])
  56. mean = totLatency / len(pl["processes"])
  57. return mean
  58. def meanReady(pl):
  59. totReady = sum([ ready(p) for p in pl["processes"]])
  60. mean = totReady / len(pl["processes"])
  61. return mean
  62. def meanCPU(pl):
  63. totCPU = sum([ cpu(p) for p in pl["processes"]])
  64. mean = totCPU / len(pl["processes"])
  65. return mean
  66. def meanCPUIO(pl):
  67. totCPUIO = sum([ cpu_io(p) for p in pl["processes"]])
  68. mean = totCPUIO / len(pl["processes"])
  69. return mean
  70. def latency(p):
  71. return p["primerTick"]-p["cargaTick"]
  72. def ready(p):
  73. return (p["ultimoTick"]-p["primerTick"])-(p["ticksBlock"]+p["ticksCpu"])+(p["primerTick"]-p["cargaTick"])
  74. def cpu(p):
  75. return p["ticksCpu"]
  76. def cpu_io(p):
  77. return p["ticksBlock"]+p["ticksCpu"]
  78. def plot_data(ind, data, color, label):
  79. opacity = 1
  80. plt.bar([i + bar_width*ind for i in index],
  81. data,
  82. bar_width,
  83. alpha=opacity,
  84. color=color,
  85. label=(label))
  86. if len(sys.argv) != 2:
  87. print("1 arg, json file")
  88. sys.exit(1)
  89. if not os.path.isfile(sys.argv[1]):
  90. print("'%s' no es un archivo / no existe" % sys.argv[1])
  91. sys.exit(2)
  92. try:
  93. data = open(sys.argv[1]).read()
  94. j = json.loads(data)
  95. index = [ 1.2*i for i in list(range(len(j["list"]))) ]
  96. plot(j["list"])
  97. except Exception as e:
  98. print("Exception")
  99. print(data)
  100. print(e)