【发布时间】:2015-05-22 18:11:24
【问题描述】:
我正在用 C 语言编写一个程序,其中有几个常量我希望我的所有函数都使用。到目前为止,我已经使用了宏。该程序的简化版本如下所示。
#define CONSTANT 10 //int
int multiplication_by_constant(int a){ return a*CONSTANT;}
int main(){
for(int i = 1; i< 10; i++)
printf("%d\n",multiplication_by_constant(i));
}
现在我想通过使用不同的常量值多次运行程序来对程序进行实验。我想自动执行此操作,而不是每次更改 CONSTANT 时都重新编译。我使用了一个简单的解决方案,将宏更改为全局变量,将原始主函数放入新的“程序()”函数中,然后在主文件中运行实验,即
int CONSTANT = 10; //int
int multiplication_by_constant(int a){ return a*CONSTANT;}
void program(){
for(int i = 1; i< 10; i++)
printf("%d\n",multiplication_by_constant(i));
}
int main(){
while(CONSTANT < 100){
program();
}
return 0;
}
我发现这种实现会导致循环性能的相当大的损失
for(int i = 1; i< 10; i++)
printf("%d\n",multiplication_by_constant(i));
现在需要比我使用宏时多 50% 的运行时间。这是正常的吗?
谁能为我推荐一种更有效的方法来运行我的实验?
PS 在 C++ 中,我会通过定义一个“类程序”、将 CONSTANT 设置为类成员并将“multiplication_by_constant”设置为成员函数来做到这一点。然后我可以使用类定义轻松地通过'main'运行实验,我认为我不会有效率损失......我必须在这个实现中使用C,这就是我求助于全局变量和功能。
【问题讨论】:
-
没有多大意义。宏在编译时进行评估。一旦你有一个二进制可执行文件并正在执行它,就没有“宏”。
-
您是如何收集统计数据的?您使用什么分析技术?
-
@JohnBode 我在“for”循环之前和之后使用“gettimeofday”来计算经过的时间
-
@Plamen:你平均跑了多少次?