我编写了自己的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