如何测量流和跟踪进度? (vanilla Java8或cylcops-react reactive streams)

时间:2017-02-16 09:39:21

标签: java java-stream cyclops-react

鉴于某些代码使用流来处理大量项目,检测日志记录和性能/分析的各个步骤的最佳方法是什么?

实际例子:

  ReactiveSeq.fromStream(pairs)
                .filter(this::satisfiesThreshold)
                .filter(this::satisfiesPersistConditions)
                .map((pair) -> convertToResult(pair, jobId))
                .flatMap(Option::toJavaStream)
                .grouped(CHUNK_SIZE)
                .forEach((chunk) ->
                {
                    repository.save(chunk);
                    incrementAndReport();
                });
  reportProcessingTime();

记录进度非常重要,因此我可以在另一个更新用户界面的线程中触发进度事件。

需要跟踪此流中的过滤和映射步骤的性能特征,以了解可以在何处进行优化以加快速度。

我看到三个选项:

  1. 在每个函数中放入日志/分析代码
  2. 在每个步骤周围使用peek而不实际使用值
  3. 基于某种注释或AOP解决方案(不知道是什么)
  4. 哪个最好?关于#3会是什么样的想法?还有其他解决方案吗?

1 个答案:

答案 0 :(得分:2)

这里有几个选项(如果我理解正确的话): -

  1. 我们可以利用经过的运算符来跟踪元素发射之间的经过时间,例如

      ReactiveSeq.fromStream(Stream.of(1,2))
                 .filter(this::include)
                 .elapsed()
                 .map(this::logAndUnwrap)
    
      Long[] filterTimeTakenMillis = new Long[maxSize];
      int filterIndex = 0;
      private <T> T logAndUnwrap(Tuple2<T, Long> t) {
          //capture the elapsed time (t.v2) and then unwrap the tuple
          filterTimeTakenMillis[filterIndex++]=t.v2;
          return t.v1;
      }
    
  2. 这只适用于cyclops-react Streams。

    1. 我们可以在FluentFunctions中使用类似AOP的功能
    2. e.g。

      ReactiveSeq.fromStream(Stream.of(1,2))
                      .filter(this::include)
                      .elapsed()
                      .map(this::logAndUnwrap)
                      .map(FluentFunctions.of(this::convertToResult)
                                         .around(a->{
      
                                          SimpleTimer timer = new SimpleTimer();
                                          String r = a.proceed();
                                          mapTimeTakenNanos[mapIndex++]=timer.getElapsedNanos();
                                          return r;
                      }));
      

      这也适用于vanilla Java 8 Streams。