Russian Qt Forum
Ноябрь 23, 2024, 06:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Тормоз  (Прочитано 4299 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 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 соразмерима с помещением в хеш. Др. решения ?

Спасибо
Записан
V1KT0P
Гость
« Ответ #1 : Май 11, 2012, 15:40 »

Ну первое что приходит в голову это заинлайнить функцию, хотя думаю это не даст больше пары процентов если функция достаточно много вычисляет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 11, 2012, 18:14 »

Ну первое что приходит в голову это заинлайнить функцию, хотя думаю это не даст больше пары процентов если функция достаточно много вычисляет.
А что еще приходит в эту голову? Улыбающийся Для Си-шника (у которого голова не забита классами) там совсем несложно
Записан
CuteBunny
Гость
« Ответ #3 : Май 11, 2012, 22:29 »

А если запоминать какие пары уже cBalanced и не вызывать её для этих пар?
Допустим в вектор part есть две точки А и Б, А и Б сБалансд на первой итерации главного цикла, а на второй итерации опять баланс между А и Б, тока в функцию передадутся в другом порядке, или порядок имеет значение?

З.Ы.: size() - по-моему лучше в цикле не вызывать, лучше в переменную загнать.
Записан
CuteBunny
Гость
« Ответ #4 : Май 11, 2012, 23:19 »

А если запоминать какие пары уже cBalanced и не вызывать её для этих пар?
Допустим в вектор part есть две точки А и Б, А и Б сБалансд на первой итерации главного цикла, а на второй итерации опять баланс между А и Б, тока в функцию передадутся в другом порядке, или порядок имеет значение?

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

Хотя нет, у Вас итак вроде циклы нормально проходят, без повторений.
Записан
alexis031182
Гость
« Ответ #5 : Май 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]);
 
Записан
trot
Гость
« Ответ #6 : Май 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. Переход на новую итерацию.
« Последнее редактирование: Май 12, 2012, 09:25 от trot » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 12, 2012, 09:38 »

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

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

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


Страница сгенерирована за 0.09 секунд. Запросов: 22.