编码风格:根据某些标志编写函数调用的最佳方式
Coding Style: Best way to program function calls dependent on some flag
这是一道简单的C题。我这样设计我的代码:
main()
{
...
do_my_func1();
...
}
do_my_func1() 这样做的地方:
void do_my_func1()
{
if (flag)
{
..do the processing for this function
}
}
我的老板说这实际上应该这样做:
main()
{
...
if (flag)
{
do_my_func1();
}
...
}
void do_my_func1()
{
..do the processing for this function
}
那么进行这样的函数调用的最佳做法是什么 - 我认为我的方法是最好的方法,尤其是当您调用许多函数时依赖于许多标志?
除非你有很好的理由,否则你绝对应该选择老板给你的选项。一种选择是:
void do_my_func1(int flag)
{
if (flag)
{
..do the processing for this function
}
}
什么是最好的要视情况而定,不能用这样一个笼统的例子来确定。
尽可能避免使用全局变量。在某些情况下它们很好,但懒惰不是其中之一。 ;)
如果flag非常多,就打包成数组或者struct。
像您的 do_my_func1()
这样的函数应该始终坚持做简单的事情,并且应该事先完成调用它的检查,所以
if (flag)
应该总是在父函数中。
另外一个好的做法是在同一个文件中调用的函数前面添加static
,这样可以减轻编译后的可执行文件
在这种情况下老板是对的。
在您的代码中总会有一个函数调用。如果未设置标志,这是无用的。
检查条件比调用函数花费的时间少得多。调用函数需要大量处理。 (link)
评估条件要容易得多。
在现代编译器中,分支预测更加准确,并且通过消除函数调用节省了大量时间。
您可以制作一个小演示来验证这一点:
`
main()
{
int n=INTMAX;
int m=INTMAX;
struct timeval start, stop;
double msecs = 0;
gettimeofday(&start, NULL);
for(;n>0;n--){
for(;m>0;m--){
if (flag)
{
do_my_func1();
}
...
}
}
gettimeofday(&stop, NULL);
msecs = (double)(stop.tv_usec - start.tv_usec) / 1000.0f + (double)(stop.tv_sec - start.tv_sec)*1000.0f ;
printf("time taken %f\n",msecs);
}
void do_my_func1()
{
..do the processing for this function
}`
v/s你的版本和记录时间。
这是一道简单的C题。我这样设计我的代码:
main()
{
...
do_my_func1();
...
}
do_my_func1() 这样做的地方:
void do_my_func1()
{
if (flag)
{
..do the processing for this function
}
}
我的老板说这实际上应该这样做:
main()
{
...
if (flag)
{
do_my_func1();
}
...
}
void do_my_func1()
{
..do the processing for this function
}
那么进行这样的函数调用的最佳做法是什么 - 我认为我的方法是最好的方法,尤其是当您调用许多函数时依赖于许多标志?
除非你有很好的理由,否则你绝对应该选择老板给你的选项。一种选择是:
void do_my_func1(int flag)
{
if (flag)
{
..do the processing for this function
}
}
什么是最好的要视情况而定,不能用这样一个笼统的例子来确定。
尽可能避免使用全局变量。在某些情况下它们很好,但懒惰不是其中之一。 ;)
如果flag非常多,就打包成数组或者struct。
像您的 do_my_func1()
这样的函数应该始终坚持做简单的事情,并且应该事先完成调用它的检查,所以
if (flag)
应该总是在父函数中。
另外一个好的做法是在同一个文件中调用的函数前面添加static
,这样可以减轻编译后的可执行文件
在这种情况下老板是对的。 在您的代码中总会有一个函数调用。如果未设置标志,这是无用的。 检查条件比调用函数花费的时间少得多。调用函数需要大量处理。 (link) 评估条件要容易得多。 在现代编译器中,分支预测更加准确,并且通过消除函数调用节省了大量时间。 您可以制作一个小演示来验证这一点: `
main()
{
int n=INTMAX;
int m=INTMAX;
struct timeval start, stop;
double msecs = 0;
gettimeofday(&start, NULL);
for(;n>0;n--){
for(;m>0;m--){
if (flag)
{
do_my_func1();
}
...
}
}
gettimeofday(&stop, NULL);
msecs = (double)(stop.tv_usec - start.tv_usec) / 1000.0f + (double)(stop.tv_sec - start.tv_sec)*1000.0f ;
printf("time taken %f\n",msecs);
}
void do_my_func1()
{
..do the processing for this function
}`
v/s你的版本和记录时间。