Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> агрессивная оптимизация 
:(
    Опции темы
aworld
Дата 30.9.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 30.9.2007

Репутация: нет
Всего: нет



есть класс описывающий многомерные массивы. Нужно применить к нему агрессивную оптимизацию. Что то вроде встраивания какой то функции в арифметические операторы, чтобы не возникало лишних копировании массивов. Объясните плиз на простом примере как это сделать.
PM MAIL   Вверх
zkv
Дата 30.9.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(aworld @  30.9.2007,  18:39 Найти цитируемый пост)
Объясните плиз на простом примере как это сделать. 

как перегрузить операторы? Я вот не понял сути проблемы... 
Где то есть массивы, и они копируются, надо чтобы не копировались. И что?
PM MAIL   Вверх
aworld
Дата 30.9.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 30.9.2007

Репутация: нет
Всего: нет



операторы перегружены... как мне объяснял преподователь, нужно написать вспомогательную функцию которая вызывается автоматически при каких то арифметических вычислениях с участием этих массивов и позволяет обойти копирование... нужно ее встраивать в операторы или еще что то я не понял ...
PM MAIL   Вверх
zkv
Дата 30.9.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



aworld, ты хоть код покажи, который оптимизировать нужно, будет понятно хоть о чем говорим.
PM MAIL   Вверх
MAKCim
Дата 30.9.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Шаблоны С++, Джосаттис (глава 18)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ln78
Дата 30.9.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



aworld, если я правильно понял, имеется в виду принцип отложенных вычислений. Пример можно посмотреть у Страуструпа, 3-е издание, п.22.4.7.
PM MAIL   Вверх
aworld
Дата 30.9.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 30.9.2007

Репутация: нет
Всего: нет



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

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  narray.cpp 22,40 Kb
PM MAIL   Вверх
Ln78
Дата 1.10.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



aworld, сначала общее замечание: давать для примера код с более 800 строками, содержащий синтаксические ошибки, не лучшее дело. Чтобы меньше тратить собственного времени (и так ушло около часа) на переделку, внёс некоторые изменения, в том числе и, вероятно, нежелательные: приватные сделал публичными. Но на примере одной из операций показал, как это можно реализовать (опять же сама операция - заглушка, ИМХО, по-хорошему, нужно писать и свой менеджер памяти, но это уже другой вопрос). Надеюсь, сравнением исходного кода и моего варианта можно отличить, что относится к желаемому примеру, а что - к моей ленности и недостатку времени.
Для операции используется вспомогательная структура
Код

template <class T> class NArray;

// Вспомогательная структура
template <class T> struct naAdd
{
    const NArray<T> &rA, &rB;
    naAdd(const NArray<T>& A,const NArray<T>& B) : rA(A), rB(B) {};
    inline NArray<T> NA() {return NArray<T>(*this);}
};


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


    void naAddAndAssign(NArray<T>* pA,const naAdd<T>& A){
// Здесь собственно реализация операции сложения двух векторов
// Это просто - заглушка, нужно переписать
        n_Dim = 1;
        n_pDim=new int[n_Dim];
        for (int i=0;i<n_Dim;i++)n_pDim[i]=1;
        n_pAr=new T[1];
        n_pAr[0]=A.rA.n_pAr[0]+A.rB.n_pAr[0];
    }
    NArray<T>& operator=(const naAdd<T>& AA) {
        naAddAndAssign(this,AA);
        return *this;
    }
    NArray<T>(const naAdd<T>& AA) {
        naAddAndAssign(this,AA);
    }

Оператор сложения заменяется такой реализацией
Код

template <class T> naAdd<T> operator+(const NArray<T>& A,const NArray<T>& B)
{
    return naAdd<T>(A,B);
}

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

    //Создание одномерного ветора из простого массива
    NArray <double> NAr3(4,mas1);
    //копирование
    NArray <double> NAr4(NAr3);

    NAr4[0]=3;
    NArray <double> NASum(NAr3+NAr4);
    NAr3.Show();
    NAr4.Show();
    NASum.Show();
    NASum = (NAr3+NAr4).NA()+NAr4;
    NASum.Show();

Второй из этих примеров, когда складываются 3 вектора, можно записать,  используя вспомогательную функцию структуры naAdd, либо писать новую вспомогательную структуру. Этот вопрос решается индивидуально к каждой операции: для самых частых используются структуры, для других можно обойтись набором функций, из которых их можно получить.
Ну вроде всё. Если что-то упустил, или непонятно, спрашивай

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  narray.cpp 23,51 Kb
PM MAIL   Вверх
aworld
Дата 2.10.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 30.9.2007

Репутация: нет
Всего: нет



Ln78, спасибо выручил. И последний вопрос: можно как то оценить скорость выполнения операции?
PM MAIL   Вверх
Ln78
Дата 2.10.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



aworld, можно самым простым способом: написать несколько выражений и цикл, измерять время. Есть способы измерения прошедшего времени очень точно, здесь обсуждались, можешь поискать. Для данных целей это не требуется, достаточно обычного GetSystemTime (для windows): вызывается дважды, перед циклом и после. Число итераций задаётся таким, чтобы было достаточно для точности и не слишком долго ждать. Кстати выигрыш от таких вроде не слишком сложных действий со структурами очень ощутим. Их имеет смысл делать даже когда размерность вектора фиксирована (например, является параметром шаблона), а уж с new - тем более.
PM MAIL   Вверх
emx
Дата 6.10.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Добрый вечер, мы (aworld и я) разобрались более или менее с агрессивной оптимизацией, но при дальнейшем выполнении курсовой (разрабатывая графическое окно для демонстрирования операций) выходят 2 ошибки компиляции при создании обьекта нашего класса. мы никак не можем от них избавиться.
Код

NAWinAp error LNK2019: unresolved external symbol "public: __thiscall NArray<double>::~NArray<double>(void)" (??1?$NArray@N@@QAE@XZ) referenced in function "public: void __thiscall CNAWinApDlg::OnBnClickedButtonPlus(void)" (?OnBnClickedButtonPlus@CNAWinApDlg@@QAEXXZ)



Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  NAWinAp.rar 70,06 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.