2016-02-25 2 views
0

потока моего тестирования производительности необходимо хамон монитора, чтобы пройти через эти шаги:Хамон не работают после сериализации + десериализаций

  1. создан,
  2. сериализованной
  3. десериализован
  4. десериализована копия должна быть остановлена

Но следующий сценарий не работает (шаг 4 не имеет эффекта).

Не могли бы вы предоставить мне обходной путь?

Доказательство с кодом:

public class Main { 

    protected static void monitorSomething() throws InterruptedException, IOException, ClassNotFoundException{ 
     Monitor outerMonitor = MonitorFactory.start("outerMonitor"); 
     for (int i=1; i<=10; i++) { 
      Monitor inner = MonitorFactory.start("myInnerMonitor"); 
      Monitor serializedMonitorSource = MonitorFactory.start("serializedMonitor"); 
      Thread.sleep(100+i); 
      byte[] serialized = serialize(serializedMonitorSource); 
      Monitor serializedMonitorDestination = (Monitor)deserialize(serialized); 
      serializedMonitorDestination.stop(); 
      inner.stop(); 
     } 
     outerMonitor.stop(); 
     MonitorFactory.start("mySecondMonitor") 
         .stop(); 

    } 

    protected static void printPerformanceMeasurements(){ 
     for(Object monitor: MonitorFactory.getMap().values()){ 
      System.out.println(monitor); 
     } 

    } 

    public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException { 
     monitorSomething(); 
     printPerformanceMeasurements(); 
    } 

    private static byte[] serialize(Serializable serializable) throws IOException { 
     try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      ObjectOutput out = new ObjectOutputStream(bos)) { 
      out.writeObject(serializable); 
      byte[] messageBytes = bos.toByteArray(); 
      return messageBytes; 
     } 

    } 

    private static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException{ 
     try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
      ObjectInput in = new ObjectInputStream(bis)) { 
      return in.readObject(); 
     }   
    } 
} 

Выходной:

JAMon Label=myInnerMonitor, Units=ms.: (LastValue=114.0, Hits=10.0, Avg=114.2, Total=1142.0, Min=105.0, Max=136.0, Active=0.0, Avg Active=1.0, Max Active=1.0, First Access=Thu Feb 25 22:01:38 EET 2016, Last Access=Thu Feb 25 22:01:39 EET 2016) 
JAMon Label=outerMonitor, Units=ms.: (LastValue=1143.0, Hits=1.0, Avg=1143.0, Total=1143.0, Min=1143.0, Max=1143.0, Active=0.0, Avg Active=1.0, Max Active=1.0, First Access=Thu Feb 25 22:01:39 EET 2016, Last Access=Thu Feb 25 22:01:39 EET 2016) 
JAMon Label=mySecondMonitor, Units=ms.: (LastValue=0.0, Hits=1.0, Avg=0.0, Total=0.0, Min=0.0, Max=0.0, Active=0.0, Avg Active=1.0, Max Active=1.0, First Access=Thu Feb 25 22:01:39 EET 2016, Last Access=Thu Feb 25 22:01:39 EET 2016) 
JAMon Label=serializedMonitor, Units=ms.: (LastValue=0.0, Hits=0.0, Avg=0.0, Total=0.0, Min=1.7976931348623157E308, Max=-1.7976931348623157E308, Active=10.0, Avg Active=0.0, Max Active=0.0, First Access=Thu Jan 01 02:00:00 EET 1970, Last Access=Thu Jan 01 02:00:00 EET 1970) 
JAMon Label=com.jamonapi.Exceptions, Units=Exception: (LastValue=0.0, Hits=0.0, Avg=0.0, Total=0.0, Min=1.7976931348623157E308, Max=-1.7976931348623157E308, Active=0.0, Avg Active=0.0, Max Active=0.0, First Access=Thu Jan 01 02:00:00 EET 1970, Last Access=Thu Jan 01 02:00:00 EET 1970) 

Следует отметить, что ни один из serializedMonitor не измеряется (активный = 10)

+0

Потому что после десериализации не существует никакого отношения к текущему экземпляру хамон. После десериализации вы получите новый экземпляр всего, что получило сериализацию. –

+0

10x для повтора. Как это решить? – joro

+0

Обходным способом? Вы не должны сериализовать эти вещи в первую очередь. –

ответ

0

Чтобы обойти проблему, не сериализовать весь объект Monitor, но только начальный момент. В точке измерения вы можете выполнить десериализацию этого момента и рассчитать разницу во времени. Затем добавьте вычисленное значение в пул статистики MonitorFactory.

Вы получаете статистику выполнения времени (min, max, avg). Недостатком является то, что вы теряете статистику активных исполнений.

Пример кода:

//   Monitor serializedMonitorSource = MonitorFactory.start("serializedMonitor"); 
     Date measuringStartOriginal = new Date(); 
     byte[] serialized = serialize(measuringStartOriginal); 
     Thread.sleep(100+i); 
//   Monitor serializedMonitorDestination = (Monitor)deserialize(serialized); 
     Date measuringStartDeserialized = (Date)deserialize(serialized); 
//   serializedMonitorDestination.stop(); 
     Date measuringEnd = (new Date()); 
     long timeDifference = measuringEnd.getTime() - measuringStartDeserialized.getTime(); 
     MonitorFactory.add("timeDifference", "ms", timeDifference); 

Результат:

JAMon Label=timeDifference, Units=ms: (LastValue=110.0, Hits=10.0, Avg=106.3, Total=1063.0, Min=102.0, Max=110.0, Active=0.0, Avg Active=0.0, Max Active=0.0, First Access=Mon Feb 29 10:43:57 EET 2016, Last Access=Mon Feb 29 10:43:58 EET 2016) 

 Смежные вопросы

  • Нет связанных вопросов^_^