Синхронизация захвата в параллельной обработке потока - PullRequest
0 голосов
/ 01 марта 2019

У меня есть класс таймера, который фиксирует время распаковки и десериализации для одного из моих процессов.Я использую параллельный поток для выполнения вышеизложенного и хотел бы узнать общее время распаковки и время десериализации для всех моих объектов

Я звоню getVersionedRawDealNew (), который выполняет распаковку и десериализацию для каждой сделки.

Время преобразования намного больше, чем время, затрачиваемое на весь метод для обработки всех моих объектов, что кажется неправильным.Можете ли вы разрешить мне, если приведенное ниже правильно с тем, как рассчитывается время преобразования?

    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 метод

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();
}

// Таймер процесса

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();
    }
}

Вывод

Я не получаю правильное вычисление времени, так как у меня есть таймер, который оборачивает вышеуказанный вызов, то есть в родительском методе, и время, необходимое для запуска всего процессаменьше моего времени трансформации.Мой таймер для родительского метода, который включает в себя время распаковки и преобразования, должен быть больше, чем мое время преобразования, а это не так.

1 Ответ

0 голосов
/ 01 марта 2019

Время преобразования больше, чем все время метода, потому что вы используете параллельный поток, который создает параллельные задачи (задачи, которые выполняются одновременно).Вы суммируете время параллельных задач, которые выполняются одновременно.

0--------------------------------------------------------  
   |                        |                             |
   |                        |                             | 
   |(1 parallel taks 3sec)  |                             |  
                            | (2 parallel task 4sec)      | 
5---------------------------------------------------------|(the whole metod took 5 sec)

Метод занял 5 (сек), одна параллельная задача заняла 3 секунды, а вторая - 4 секунды, поэтому время преобразования равно7, что больше, чем общее время метода 5 сек.

...