首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAMon在serialization+deserialization之后不工作

JAMon在serialization+deserialization之后不工作
EN

Stack Overflow用户
提问于 2016-02-25 20:14:53
回答 1查看 71关注 0票数 0

我的性能测试流程需要JAMon监视器来完成以下步骤:

  1. 被创造,
  2. 串行化
  3. 反序列化
  4. 要停止的反序列化副本

但是下面的场景不起作用(步骤4没有效果)。

你能给我一个解决办法吗?

用代码证明

代码语言:javascript
复制
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();
        }         
    }
}

输出

代码语言:javascript
复制
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是测量的(active=10)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 08:45:20

解决办法不是序列化整个Monitor对象,而是只序列化开始时刻。在测量点,您可以反序列化该时刻,并从现在起计算时差。然后将计算值添加到MonitorFactory统计信息池中。

您将获得时间执行统计信息(min、max、avg)。缺点是您丢失了活动执行的统计数据。

示例代码:

代码语言:javascript
复制
//            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 );

结果:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35637408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档