首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行流处理中的捕获定时

并行流处理中的捕获定时
EN

Stack Overflow用户
提问于 2019-03-01 10:39:40
回答 1查看 199关注 0票数 0

我有一个timer类,它捕获我的一个进程的解压缩时间和反序列化时间。我使用并行流进行上述操作,并希望了解所有对象的聚合解压缩时间和反序列化时间。

我正在调用getVersionedRawDealNew(),它对每个事务进行解压缩和反序列化。

转换时间比整个处理我所有对象的方法花费的时间长得多,这似乎是不正确的。如果下面的转换时间计算方法是正确的,你能让我这样做吗?

代码语言:javascript
复制
    ProcessTimer timer = new ProcessTimer();
    List<VersionedRawDeal> versionedRawDeals = compressedVersionedRawDeals
            .parallelStream()
            .map(vrd -> getVersionedRawDealNew(vrd, timer))
            .collect(Collectors.toList());

    LOGGER.info("Time taken to process zipping : " + timer.getZipTime());
    LOGGER.info("Time taken to process transformation :" + timer.getTransformTime());

//getVersonedRawDealNew方法

代码语言:javascript
复制
private VersionedRawDeal getVersionedRawDealNew(CompressedVersionedRawDeal compressedVerDeal, ProcessTimer timer){
    CompressedRawDeal compressedDeal = compressedVerDeal.rawDeal();
    DealVersion dealVersion = compressedVerDeal.dealVersion();

    long zipStartTime = System.currentTimeMillis();
    final String dealXml = unzip(dealVersion, compressedDeal.getDealXmlBytes());
    long zipTime = System.currentTimeMillis() - zipStartTime;
    timer.addZipTime(zipTime);

    long transformStartTime = System.currentTimeMillis();
    final RawDeal rawDeal = RawDealTransformers.getRawDealTransformerFor(compressedDeal.getSourceSystem())
            .transformDeal(compressedDeal.getSourceEvent(), dealXml);

    long transformTime = System.currentTimeMillis() - transformStartTime;
    timer.addTransformTime(transformTime);
    return ImmutableVersionedRawDeal.builder().dealVersion(dealVersion).rawDeal(rawDeal).build();
}

//进程定时器

代码语言:javascript
复制
public class ProcessTimer {

    private AtomicLong zipTime;
    private AtomicLong transformTime;

    public ProcessTimer(){
        this.zipTime = new AtomicLong();
        this.transformTime = new AtomicLong();
    }

    public void addZipTime(long time){
        this.zipTime.addAndGet(time);
    }

    public void addTransformTime(long time){
        this.transformTime.addAndGet(time);
    }

    public long getZipTime(){
        return zipTime.get();
    }

    public long getTransformTime(){
        return transformTime.get();
    }
}

输出

我没有得到正确的时间计算,因为我有一个将上述调用包装起来的计时器,即在父方法中,运行整个进程所需的时间比我的转换时间要短。包含解压缩和转换时间的父方法的计时器应该大于我的转换时间,但情况并非如此。

EN

回答 1

Stack Overflow用户

发布于 2019-03-01 14:37:45

转换时间大于整个方法时间,因为您使用的是并行流,它创建并行任务(同时运行的任务)。同时运行的并行任务的时间之和。

代码语言:javascript
复制
0--------------------------------------------------------  
   |                        |                             |
   |                        |                             | 
   |(1 parallel taks 3sec)  |                             |  
                            | (2 parallel task 4sec)      | 
5---------------------------------------------------------|(the whole metod took 5 sec)

该方法耗时5(秒),并行任务之一耗时3秒,第二次耗时4秒,转换时间为7,大于整体方法时间5秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54942884

复制
相关文章

相似问题

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