2011-03-20 90 views
0

我有一个函数,如果单个输入参数的数目很大,该函数在程序中也会运行数亿次。优化函数的参数输入

如果我想优化这个函数,我应该创建一个新的数据结构来保存所有输入参数,并通过引用将其传递给函数,而不是将每个参数单独传递给函数?或者,这样做无关紧要,因为编译器足够聪明,能够以更高效的方式处理这个问题?

+0

如果编译器不内联这样的函数,我会感到非常惊讶。它是递归的吗? – CromTheDestroyer 2011-03-20 23:35:52

+0

不,不递归,只是在一个巨大的5嵌套循环... – Faken 2011-03-20 23:37:20

回答

2

通常,传递包含变量的数据结构要好得多。这不是徒有其表或使用:

void f(int a, int b, int c, int d, int e, int f) 
{ 
    // do stuff 
} 

这是好得多:

void f(Params p) 
{ 
    // do stuff with p 
} 

你可能想要做按引用传递,所以编译器可以直接传递给对象的引用,而不是复制整个数据结构。 作为一个真实的例子:

double distance(double x1, double y1, double z1, double x2, double y2, double z2) 
{ 
    double dx = x1 - x2; 
    double dy = y1 - y2; 
    double dz = z1 - z2; 

    return sqrt(dx*dx + dy*dy + dz*dz); 
} 

这将是更好的,如果包裹我们的(X,Y,Z)到数据结构,但:

struct Point 
{ 
    double x; 
    double y; 
    double z; 
}; 

double distance(const Point &p1, const Point &p2) 
{ 
    double dx = p1.x - p2.x; 
    double dy = p1.y - p2.y; 
    double dz = p1.z - p2.z; 

    return sqrt(dx*dx + dy*dy + dz*dz); 
} 

更清洁的代码,你会得到额外的奖励它可以*表现更好(*取决于你的编译器在优化任何版本时的智能程度)。

很显然,这取决于您实际尝试完成的内容,但是如果您有几个(4+)变量在某个上下文中具有相似的用法,最好将它传递给数据结构。

+0

嗯...... 96个变量怎么样?该函数是一个沉重的数学相关函数。 – Faken 2011-03-20 23:38:33

+0

96个变量表明你可能做错了什么。你到底在做什么? – 2011-03-20 23:39:06

+0

变量来自左侧的右侧和中间,并根据该函数所处的大量循环进行选择。一般来说,我应该使用一种结构? – Faken 2011-03-20 23:40:07

1

参数大多是不变的,或者大多数参数在每次调用时都会改变?如果你只能做一次,你不想多次评估参数。

请记住编译器用参数进行的操作。

它评估每一个并将其推入堆栈。然后输入该函数,并通过它们在堆栈中的偏移量引用这些参数。所以它基本上与将参数放入块并通过块相同。但是,如果您自己构建块,则可以重新使用旧值并仅评估已知更改的值。

在任何情况下,您都必须查看函数内部相对于传递参数花费的时间内的工作量。不知道总体时间跨度是多少,你称它为10^8次是毫无意义的。这可能是每个电话10ns,或每个电话10ms。如果后者几乎所有的时间都花在了函数内部,所以它可能并没有太大的区别。