我有一个函数,如果单个输入参数的数目很大,该函数在程序中也会运行数亿次。优化函数的参数输入
如果我想优化这个函数,我应该创建一个新的数据结构来保存所有输入参数,并通过引用将其传递给函数,而不是将每个参数单独传递给函数?或者,这样做无关紧要,因为编译器足够聪明,能够以更高效的方式处理这个问题?
我有一个函数,如果单个输入参数的数目很大,该函数在程序中也会运行数亿次。优化函数的参数输入
如果我想优化这个函数,我应该创建一个新的数据结构来保存所有输入参数,并通过引用将其传递给函数,而不是将每个参数单独传递给函数?或者,这样做无关紧要,因为编译器足够聪明,能够以更高效的方式处理这个问题?
通常,传递包含变量的数据结构要好得多。这不是徒有其表或使用:
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+)变量在某个上下文中具有相似的用法,最好将它传递给数据结构。
参数大多是不变的,或者大多数参数在每次调用时都会改变?如果你只能做一次,你不想多次评估参数。
请记住编译器用参数进行的操作。
它评估每一个并将其推入堆栈。然后输入该函数,并通过它们在堆栈中的偏移量引用这些参数。所以它基本上与将参数放入块并通过块相同。但是,如果您自己构建块,则可以重新使用旧值并仅评估已知更改的值。
在任何情况下,您都必须查看函数内部相对于传递参数花费的时间内的工作量。不知道总体时间跨度是多少,你称它为10^8次是毫无意义的。这可能是每个电话10ns,或每个电话10ms。如果后者几乎所有的时间都花在了函数内部,所以它可能并没有太大的区别。
如果编译器不内联这样的函数,我会感到非常惊讶。它是递归的吗? – CromTheDestroyer 2011-03-20 23:35:52
不,不递归,只是在一个巨大的5嵌套循环... – Faken 2011-03-20 23:37:20