我有一个main函数多次调用一个辅助函数,它创建了一个相当大的矩阵(10 ^ 8个复数)。到目前为止,我已经有辅助函数每次分配内存并从头开始构建矩阵。是不是最好在main函数中分配一次内存,并将其指针传递给辅助函数来更新它?
我的下面的天真测试表明这确实更有效。
#include <RcppArmadillo.h>
#include <iostream>
// [[Rcpp::depends(RcppArmadillo)]]
// this version returns a new G0 everytime
// [[Rcpp::export]]
arma::cx_mat helper1(int N, int ii) {
arma::cx_mat G0 = arma::eye<arma::cx_mat>( N, N );
// dummy calculation
G0 = 0 * G0 + ii;
return(G0);
}
// this version updates G0 defined elsewhere
// [[Rcpp::export]]
void helper2(int N, int ii, arma::cx_mat& G0) {
// dummy calculation
G0 = 0 * G0 + ii;
}
// [[Rcpp::export]]
arma::cx_double main1(int N, int Nl) {
arma::cx_mat G0 ;
int ii;
for (ii=1; ii<Nl; ii++){
G0 = helper1(N, ii);
}
return(G0(1,1));
}
// [[Rcpp::export]]
arma::cx_double main2(int N, int Nl) {
arma::cx_mat G0 = arma::eye<arma::cx_mat>( N, N );
int ii;
for (ii=1; ii<Nl; ii++){
helper2(N, ii, G0);
}
return(G0(1,1));
}
/*** R
main1(100, 10)
main2(100, 10)
library(microbenchmark)
microbenchmark(main1(3000, 50), main2(3000, 50), times = 5)
# Unit: seconds
# expr min lq mean median uq max
# main1(3000, 50) 7.160945 7.180199 7.218132 7.203668 7.237876 7.307974
# main2(3000, 50) 2.432682 2.432864 2.446226 2.436771 2.439675 2.489136
*/
当然,在实践中,程序会执行各种计算,因此我不确定是否应该依赖此虚拟示例的结果。在我咬紧牙关并将我的所有代码转换为遵循此更新&#39;之前策略,我希望更加自信,这是一个很好的方法......