如何减少自定义RxCpp运算符的编译时间?

时间:2017-11-03 07:38:46

标签: c++ templates c++14 compile-time

我编写了自己的RxCpp运算符subscribe_with_latest_from作为组成现有运算符的函数。但是,编译需要很长时间。这个例子在我的系统上编译需要将近6秒钟(使用Clang):

#include <rxcpp/rx.hpp>

template<typename Fn, typename... Observables>
auto subscribe_with_latest_from(Fn f, Observables... observables) {
    return [=](auto &&source) {
        return source
                .with_latest_from(
                        [=](auto &&...args) {
                            f(args...);
                            return 0; // dummy value
                        },
                        observables...
                )
                .subscribe([](auto _) {});
    };
}

int identity(int value) { return value; }

auto process(rxcpp::observable<int> source) {
    // do some operations
    return source
            .map(identity)
            .map(identity)
            .map(identity)
            .map(identity)
            .map(identity);
};

int main() {
    const rxcpp::rxsub::subject<int> s1;
    const rxcpp::rxsub::subject<int> s2;
    const rxcpp::rxsub::subject<int> s3;

    process(s1.get_observable()) |
        subscribe_with_latest_from(
                [&](int v1, int v2, int v3) {
                    // do something
                },
                process(s2.get_observable()),
                process(s3.get_observable())
        );

    s1.get_subscriber().on_next(1);
    s2.get_subscriber().on_next(2);
    s3.get_subscriber().on_next(3);
    s1.get_subscriber().on_next(11);

}

如果用

替换运算符的用法,它将在近3秒内编译
process(s1.get_observable())
        .with_latest_from(
                [&](int v1, int v2, int v3) {
                    // do something
                    return 0;
                },
                process(s2.get_observable()),
                process(s3.get_observable())
        )
        .subscribe([](int _) {});

如何减少/消除自定义运算符subscribe_with_latest_from的编译时间开销?

注意:我使用

衡量编译时间
clang++ -ftime-report -I"/path/to/RxCpp/include" -std=c++14 main.cpp

0 个答案:

没有答案