Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Мая 11, 2012, 12:02



Название: Тормоз
Отправлено: Igors от Мая 11, 2012, 12:02
Добрый день

Притормаживает такой кусочек

Код
C++ (Qt)
vector <Point> data, part;
..
for (int i = 0; data.size(); ++i) {        // в контейнере data элементов очень много
Lookup(data[i], part);                     // отобрали часть элементов (обычно 5-7) в part
 
// теперь надо проверить part "каждый с каждым"
for (int j = 0; j < part.size() - 1; ++j)
 for (int k = j + 1; k < part.size(); ++k)
  Balance(part[j], part[k]);
}
 
Ф-ция Balance вызывается много раз с теми же аргументами, простое решение сначала класть пары в хеш и по окончании главного цикла пройтись по хешу. Но это работает никак не быстрее - скорость Balance соразмерима с помещением в хеш. Др. решения ?

Спасибо


Название: Re: Тормоз
Отправлено: V1KT0P от Мая 11, 2012, 15:40
Ну первое что приходит в голову это заинлайнить функцию, хотя думаю это не даст больше пары процентов если функция достаточно много вычисляет.


Название: Re: Тормоз
Отправлено: Igors от Мая 11, 2012, 18:14
Ну первое что приходит в голову это заинлайнить функцию, хотя думаю это не даст больше пары процентов если функция достаточно много вычисляет.
А что еще приходит в эту голову? :) Для Си-шника (у которого голова не забита классами) там совсем несложно


Название: Re: Тормоз
Отправлено: CuteBunny от Мая 11, 2012, 22:29
А если запоминать какие пары уже cBalanced и не вызывать её для этих пар?
Допустим в вектор part есть две точки А и Б, А и Б сБалансд на первой итерации главного цикла, а на второй итерации опять баланс между А и Б, тока в функцию передадутся в другом порядке, или порядок имеет значение?

З.Ы.: size() - по-моему лучше в цикле не вызывать, лучше в переменную загнать.


Название: Re: Тормоз
Отправлено: CuteBunny от Мая 11, 2012, 23:19
А если запоминать какие пары уже cBalanced и не вызывать её для этих пар?
Допустим в вектор part есть две точки А и Б, А и Б сБалансд на первой итерации главного цикла, а на второй итерации опять баланс между А и Б, тока в функцию передадутся в другом порядке, или порядок имеет значение?

З.Ы.: size() - по-моему лучше в цикле не вызывать, лучше в переменную загнать.

Хотя нет, у Вас итак вроде циклы нормально проходят, без повторений.


Название: Re: Тормоз
Отправлено: alexis031182 от Мая 12, 2012, 00:31
В приведённом коде не понятно, как "каждый с каждым", если сравниваются только соседние элементы. Или так и надо?
Код
C++ (Qt)
// теперь надо проверить part "каждый с каждым"
for (int j = 0; j < part.size() - 1; ++j)
 for (int k = j + 1; k < part.size(); ++k)
  Balance(part[j], part[k]);
 


Название: Re: Тормоз
Отправлено: trot от Мая 12, 2012, 09:22
1. Функция возвращает претедента на запись в вектор part.
 
Код:
Point * pointPart = Lookup(data[i]);

2. Далее цикл сравнения

Код:
for (int j= 0; j < part.size(); ++j)
   Balance(part[j], pointPart);
3. И после этого добавляем элемент в вектор.

4. Переход на новую итерацию.


Название: Re: Тормоз
Отправлено: Igors от Мая 12, 2012, 09:38
опять баланс между А и Б, тока в функцию передадутся в другом порядке, или порядок имеет значение?
Нет, не имеет, Balance все равно какой порядок аргументов, результат тот же. Также part может содержать не сами элементы, а указатели на них или индексы в data

В приведённом коде не понятно, как "каждый с каждым", если сравниваются только соседние элементы. Или так и надо?
Не только соседи, напр j = 0, k = 2

1. Функция возвращает претедента на запись в вектор part.
Так нельзя. Lookup заполняет вектор точек - ближайших соседей к i-й точке. Balance проверяет разницу между ними. Исходный вектор data здесь никак не меняется