为什么LogicalVector对std::vector<;双倍>;转换需要这么长时间?
当使用Rcpp与外部库接口时,我们必须从 Rcpp内置的容器类通常是标准容器 上课。这种转换,一如既往,是有代价的。通常这种开销 是相当确定的,但在Rcpp转换为为什么LogicalVector对std::vector<;双倍>;转换需要这么长时间?,r,rcpp,rcpp11,R,Rcpp,Rcpp11,当使用Rcpp与外部库接口时,我们必须从 Rcpp内置的容器类通常是标准容器 上课。这种转换,一如既往,是有代价的。通常这种开销 是相当确定的,但在Rcpp转换为LogicalVector 对于std::vector而言,成本似乎与其他类型不符 演员/推广费用 考虑以下六个简单的从 LogicalVector到std::vector容器 // Equality check functions. // [[Rcpp::export]] svi test_auto_conversion_std_in
LogicalVector
对于std::vector
而言,成本似乎与其他类型不符
演员/推广费用
考虑以下六个简单的从
LogicalVector到std::vector容器
// Equality check functions.
// [[Rcpp::export]]
svi test_auto_conversion_std_int(const svi& v) {
return v;
}
// [[Rcpp::export]]
svi test_as_conversion_std_int(const lv& v) {
svi v2 = as<svi>(v);
return v2;
}
// [[Rcpp::export]]
svi test_manual_conversion_std_int(const nv& v) {
svi v2(v.begin(),v.end());
return v2;
}
// [[Rcpp::export]]
svd test_auto_conversion_std_dbl(const svd& v) {
return v;
}
// [[Rcpp::export]]
svd test_as_conversion_std_dbl(const lv& v) {
svd v2 = as<svd>(v);
return v2;
}
// [[Rcpp::export]]
svd test_manual_conversion_std_dbl(const nv& v) {
svd v2(v.begin(),v.end());
return v2;
}
> small_l_vec <- c(T,F,NA)
> small_i_vec <- as.integer(small_l_vec)
> small_n_vec <- as.numeric(small_l_vec)
> all( identical(small_i_vec, test_auto_conversion_std_int(small_l_vec)),
+ identical(small_i_vec, test_as_conversion_std_int(small_l_vec)),
+ .... [TRUNCATED]
[1] TRUE
> all( identical(small_n_vec, test_auto_conversion_std_dbl(small_l_vec)),
+ identical(small_n_vec, test_as_conversion_std_dbl(small_l_vec)),
+ .... [TRUNCATED]
[1] TRUE
但是如果Rcpp提升了LogicalVector
,并且用于填充
直接使用标准容器,效果更佳
> declared_promoted_r_to_std_like_type()
expr median
rcpp_lv_promote_std_int(l_vec) 5019.586
rcpp_lv_promote_std_dbl(l_vec) 8007.522 <<< Much better!
>声明的\u升级\u r\u为\u标准\u like \u类型()
expr中值
rcpp_lv_Promotion_std_int(l_vec)5019.586
rcpp_lv_Promotion_std_dbl(l_vec)8007.522
# Functions return "size" only so no copy costs.
> declared_direct() > declared_std_like_types()
expr median expr median
rcpp_lv(l_vec) 1.1280 std_bool(l_vec) 7352.500
> declared_promoted_r() > declared_promoted_std()
expr median expr median
rcpp_iv(l_vec) 2932.712 std_int(l_vec) 6790.508
rcpp_nv(l_vec) 5359.769 std_dbl(l_vec) 12810.550 <<< OUCH!
> declared_std_like_types_promoted_using_std_promotion()
expr median
std_bool_promote_int(l_vec) 12725.724
std_bool_promote_dbl(l_vec) 13626.782
> declared_promoted_r_to_std_like_type()
expr median
rcpp_lv_promote_std_int(l_vec) 5019.586
rcpp_lv_promote_std_dbl(l_vec) 8007.522 <<< Much better!