Оптимизация ввода параметров для функций - PullRequest
0 голосов
/ 21 марта 2011

У меня есть функция, которая имеет большое число, если отдельные входные параметры, эта функция также запускается сотни миллионов раз во время программы.

Если я хотел оптимизировать эту функцию, должен ли я создать новую структуру данных, которая содержит все входные параметры и передать ее функции по ссылке вместо передачи каждого параметра по отдельности функции? Или это не имеет значения, потому что компилятор достаточно умен, чтобы справиться с этим еще более эффективным способом?

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

В общем, гораздо лучше передать структуру данных, которая содержит ваши переменные.Это не красиво, чтобы смотреть или использовать:

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+) переменных, которые имеют аналогичное использование в определенном контексте, может быть лучше просто передать его в структуру данных.

1 голос
/ 21 марта 2011

Являются ли аргументы в основном постоянными или большинство из них изменяется при каждом вызове? Вы не хотите оценивать аргументы много раз, если бы вы могли сделать их только один раз.

Имейте в виду, что компилятор делает с аргументами.

Он оценивает каждый из них и помещает его в стек. Затем функция вводится, и она ссылается на эти аргументы по их смещению в стеке. Так что это в основном так же, как если бы вы помещали аргументы в блок и передавали блок. Однако, если вы создадите блок самостоятельно, вы сможете повторно использовать старые значения и оценивать только те, которые, как вы знаете, изменились.

В любом случае вам действительно нужно посмотреть, сколько работы происходит внутри функции относительно времени, потраченного на передачу ей аргументов. Не имеет значения, что вы называете это 10 ^ 8 раз, не зная, в течение какого промежутка времени. Это может быть 10 нс за звонок или 10 мс за звонок. Если последнее, то почти все время тратится внутри функции, так что, вероятно, не имеет особого значения, как вы ее называете.

...