batchplotter.py 2.8 KB

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