Поменяйте местами двойные массивы в c ++ - PullRequest
1 голос
/ 09 октября 2009

У меня есть следующий метод для замены двух двойных массивов (double **) в c ++. При профилировании кода метод учитывает 7% времени выполнения ... Я думал, что это должна быть недорогая операция, какие-либо предложения? Я новичок в C ++, но я надеялся просто поменять местами ссылки на массивы.

 62 void Solver::Swap(double** &v1, double** &v2)
 63 {
 64         double** vswap = NULL;
 65         vswap = v2;
 66         v2 = v1;
 67         v1 = vswap;
 68 }

Ответы [ 5 ]

4 голосов
/ 09 октября 2009

1) Убедитесь, что ваша функция встроена.

2) Вы можете разместить своп, используя XOR, например

3) Попробуйте заставить компилятор передавать аргументы, используя регистр вместо стека (хотя в x86 много регистров, стоит попробовать) - вы можете использовать стандартное ключевое слово register или играть с fastcall на компиляторе MS.

typedef double** TwoDimArray;

class Solver
{
  inline void Swap( register TwoDimArray& a, register TwoDimArray& b )
  {
    a ^= b ^= a ^= b;
  }
};

4) Не задавайте значения по умолчанию для временных значений, таких как vswap.

3 голосов
/ 09 октября 2009

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

1 голос
/ 09 октября 2009

Вы уверены, что профилировали полностью оптимизированный код?

Вы должны inline эту функцию.

Помимо этого, единственное, что я вижу, это то, что вы сначала присваиваете NULL для vswap, а сразу после этого какое-то другое значение - но об этом должен позаботиться оптимизатор.

 inline void Solver::Swap(double** &v1, double** &v2)
 {
   double** vswap = v2;
   v2 = v1;
   v1 = vswap;
 }

Однако, почему бы вам не использовать std::swap()?

1 голос
/ 09 октября 2009

Полагаю, ваш профилировщик немного запутался, так как этот метод действительно меняет только два указателя, что очень дешево. Если этот метод не называется много , он не должен отображаться в профиле. Ваш профилировщик говорит вам, как часто вызывается этот метод?

Одна проблема, которую вы должны знать при перестановке, заключается в том, что один массив может находиться в кэше, а другой - нет (особенно если они большие), поэтому постоянная замена указателей может привести к сбою кэша, но это будет общее замедление.

0 голосов
/ 19 февраля 2010

Не думайте, что 7% означает, что эта операция медленная - это зависит от того, что происходит else .

У вас может быть операция, которая занимает всего 1 наносекунду, и заставляет ее занимать почти 100% времени, ничего не делая.

...