java - 如何计算rx中的处理时间

标签 java rx-java

对于以下流程,我想知道如何计算处理 forEach(...) 中所有数据所需的时间。

Observable
  .from(1,2,3)
  .flatMap(it - {})
  .toBlocking()
  .forEarch(it -> {//some paring logic here})

编辑

阅读本教程后:Leaving the Monad ,我觉得简单的解决方案是执行以下操作。如果我错过了什么,请告诉我

List items = Observable
      .from(1,2,3)
      .flatMap(it - {})
      .toList();

long startTime = System.currentTimeMillis();

for(Object it : items)
{
  //some parsing here
}

long processingTime = System.currentTimeMillis() - startTime 

最佳答案

一个选项是创建一个 Observable 来输出时间。您可以通过使用 Observable#using 包装您的计算来做到这一点:

public class TimerExample {
    public static void main(String[] args) {
        final PublishSubject<Long> timings = PublishSubject.create();

        final Observable<List<Integer>> list = Observable
                .just(1, 2, 3)
                .flatMap(TimerExample::longRunningComputation)
                .toList();

        final Observable<List<Integer>> timed
                = Observable.using(() -> new Timer(timings), (t) -> list, Timer::time);

        timings.subscribe(time -> System.out.println("Time: " + time + "ms"));

        List<Integer> ints = timed.toBlocking().last();
        System.out.println("ints: " + Joiner.on(", ").join(ints));

        ints = timed.toBlocking().last();
        System.out.println("ints: " + Joiner.on(", ").join(ints));
    }

    private static Observable<Integer> longRunningComputation(Integer i) {
        return Observable.timer(1, TimeUnit.SECONDS).map(ignored -> i);
    }

    public static class Timer {
        private final long startTime;
        private final Observer<Long> timings;

        public Timer(Observer<Long> timings) {
            this.startTime = System.currentTimeMillis();
            this.timings = timings;
        }

        public void time() {
            timings.onNext(System.currentTimeMillis() - startTime);
        }
    }
}

在这种情况下,计时会打印到控制台,但您可以随意使用它们:

Time: 1089ms
ints: 2, 1, 3
Time: 1003ms
ints: 1, 3, 2

关于java - 如何计算rx中的处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704962/

相关文章:

java - 在部署到 tomcat 之前(或期间)如何管理 .war 文件中的库版本?

garbage-collection - 如果我删除对我订阅的 observable 的所有显式引用,它会被垃圾收集吗?

java - 如何使用 Retrofit 2.0 和新的 MockRetrofit 类模拟服务?

java - RxJava 和 RxJava 2 可以共存于同一个 Android 项目中吗?

java - 是否可以在没有两个循环的情况下遍历二维数组?

java - JSF 2.0(Primefaces) - 复合组件不可访问,如果通过 ID 引用

java - JSF 和 Facebook

java - Android 自定义 ListView 仅显示 Firebase 数据库中的一项

android - 使用 RxJava 从 2 个可观察对象中获取一个结果

android - RxJavaPlugins.getInstance 已弃用