use*_*913 5 c++ configuration c-preprocessor
我试图对用C++编写的算法的许多(约25个)变体进行基准测试.
我使用三种方法的组合实现了这些变化:
复制代码并对复制的版本进行细微更改
子类化基本算法类
使用#ifdefs在代码片段之间切换
选项1和2产生的变化是可以的,因为我可以选择在配置文件中运行算法的哪个变体.然后,我可以遍历不同的配置文件并保留"配置:结果"对的记录 - 保留这些记录对我的工作非常重要.
我目前遇到问题,#ifdef因为我必须编译多个版本的代码来访问这些变体,这使得运行自动化实验脚本和保持结果的准确记录变得更加困难.在#ifdefS,然而,是非常有用的,因为如果我发现代码中的一个拷贝错误,那么我不记得要纠正这个错误的多个副本.
该#ifdef小号扩大我创建由两个复制代码和子类为24个总变化(4个变化为每个基本变化)6度的变化.
这是一个例子 - 主要是我使用#ifdefs来避免复制太多代码:
....
double lasso_gam=*gamma;
*lasso_idx=-1;
for(int aj=0;aj<(int)a_idx.size();aj++){
int j=a_idx[aj];
assert(j<=C*L);
double inc=wa[aj]*(*gamma)*signs[aj];
if( (beta_sp(j)>0 && beta_sp(j)+inc<0)
#ifdef ALLOW_NEG_LARS
|| (beta_sp(j)<0 && beta_sp(j)+inc>0)
#else
|| (beta_sp(j)==0 && beta_sp(j)+inc<0)
#endif
){
double tmp_gam=-beta_sp(j)/wa[aj]*signs[aj];
if(tmp_gam>=0 && tmp_gam<lasso_gam) {
*lasso_idx=aj;
*next_active=j;
lasso_gam=tmp_gam;
}
}
}
if(lasso_idx>=0){
*gamma=lasso_gam;
}
....
Run Code Online (Sandbox Code Playgroud)
问题:#ifdef在给定配置文件的情况下,允许运行当前由s 指定的算法的多个变体的最佳方法是什么,该配置文件指定要运行的算法的哪个变体.
理想情况下,我只想编译一次代码,并在运行时使用配置文件选择算法变体.
如果您的#ifs 分散在各处并在这里或那里更改一行代码,则根据传递到要运行的变体的函数的枚举将所有#ifs 转换为s 并希望编译器在优化方面做得很好。if希望它会生成与多次定义函数几乎相同的代码,除了使用单个运行时条件来决定运行哪个。没有保证。
如果您正在#if算法中使用一段代码,请将算法拆分为较小的函数,以便整个算法的不同实现可以调用。#if如果您的s 太具有侵入性以至于您最终会得到 50 个函数,那么这显然是不切实际的。
| 归档时间: |
|
| 查看次数: |
398 次 |
| 最近记录: |