相同C++代码:g++编译与Rcpp调用为何速度差近4倍?
为什么Rcpp调用C代码比直接g编译快4倍?
这个问题其实挺常见的,核心原因大概率不是编译器本身不同,而是编译优化参数和链接配置的差异在搞鬼,我给你拆解几个最可能的点:
编译优化等级是头号嫌疑
Rcpp在编译C代码时,默认就开启了较高的优化级别(通常是-O2甚至-O3),还可能加上针对你本地CPU的专属优化参数比如-march=native,让代码充分利用你机器的硬件特性。但如果你直接用g++ yourcode.cpp编译,默认是-O0级别——这是为调试准备的,几乎没做任何性能优化,代码运行起来自然慢一大截。
你可以试试给g加上和Rcpp一致的优化参数再编译,比如:g++ -O3 -march=native yourcode.cpp -lnlopt -o test再运行对比,速度应该会大幅提升,甚至和Rcpp调用的版本持平。
链接的库版本/方式可能有差异
你用到了nlopt优化库,Rcpp调用时可能链接的是R环境里预编译好的、经过优化的nlopt版本,甚至是静态链接;而你直接编译时可能动态链接了系统默认的nlopt库,那个库可能没做过优化,或者动态链接带来了额外的运行开销。你可以检查R里nlopt的链接配置,再对应调整g++的链接参数。编译器本身?可能性极小
除非你手动给R配置了不同的编译器(比如clang而非系统默认的g++),否则Rcpp默认用的就是你系统里的g++。所以核心差异不在编译器,而在编译时的参数设置。
验证方法
你可以在R里查看Rcpp的编译参数,运行以下命令:
Sys.getenv("PKG_CXXFLAGS") Sys.getenv("PKG_LIBS")
把输出的参数原封不动加到你的g++编译命令里,再运行一次,应该就能看到速度差异消失了。
内容的提问来源于stack exchange,提问作者David Zarruk Valencia
相关产品推荐
相关产品推荐

