Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Что эффективнее, если в качестве критерия использовать скорость
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Timprog Timprog вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.07.2003
По умолчанию Что эффективнее, если в качестве критерия использовать скорость - 26.07.2003, 09:07

Наверняка юзали, создавали класс Matrix.
что эффективнее, если в качестве критерия использовать скорость?
Вариант 1:
Код:
class Matrix{
public:
 //конструкторы, деструкторы итд.
__m128d& operator()(int I, int J);
 //всё остальное
private:
__m128d* array;
}
Примечание: вместо __m128d - любой шаблон, но есть такая вешь как выравнивание в SSE2, поэтому пример конкретный.

Доступ с помощью такой фитчи:
Код:
__m128d& Matrix::operator()(int I, int J){
  return *(array+maxJ*j+i);
  //j пробегает от 0 до MaxJ-1, также i.
}
Вариант 2 (классический)

Код:
class Matrix{
public:
 //конструкторы, деструкторы итд.
__m128d& operator()(int I, int J);
 //всё остальное
private:
__m128d** array;
}
Доступ с помощью:

Код:
__m128d& Matrix::operator()(int I, int J){
  return array[I][J];
  //j пробегает от 0 до MaxJ-1, также i.
}
Вариант 3: Очень крутой:
Код:
???????????????????????????????????????????  8)
Кстати, как можно транспонировать матрицу МНГОВЕННО? (не пробегая ни одного элемента)
Ответить с цитированием
  (#2 (permalink)) Старый
Rayal Rayal вне форума
Новичок
 
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.07.2003
По умолчанию 28.07.2003, 02:44

Идеальное транспонирование - миф.
Но можно для часто встречающихся матриц засечь смещения меняемых элементов и сделать для них чуть быстрее.

3x3:
1-3
2-6
5-7

4x4:
2-5
3-9
4-13
7-10
8-14
12-15

Это из предположения что элементы по одному байту в массиве с индексацией от ноля.
Ответить с цитированием
  (#3 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 28.07.2003, 06:44

Можно, я тут подумал и пришёл к такой фитчи:
Берётся метод индексирования номер 1.
Код:
__m128d& Matrix::operator()(int I, int J){ 
  return *(array+maxJ*j+i); 
  //j пробегает от 0 до MaxJ-1, также i. 
}
И в случае транспонированной матрицы используется другая функция доступа к элементам. Подробно поясню: для обычной (не транспонированной) матрицы операция доступа такова:
Код:
__m128d& Matrix::operator()(int I, int J){ 
  return *(array+maxJ*j+i); 
  //j пробегает от 0 до MaxJ-1, также i. 
}
При транспонировании вызывается какя-нть функция типа transpose() к объекту класса Matrix. Её тело:
Код:
void Matrix::transpose(){
 int temp;
 temp=maxI;
 maxI=maxJ;
 maxJ=temp;
}
И усё!
Вот только одна беда: operator()(i,j) - больше не годится. Для этого надо написать нечто вроде GetElementOfTransposedMatrix(i,j):
Код:
__m128d& Matrix::GetElementOfTransposedMatrix(int I, int J){ 
  return *(array+maxI*i+j); //поменяли местами
  //j пробегает от 0 до MaxJ-1, также i. 
}
Тогда ответственность за правильность возлагается на программиста, то есть с обычной матрицей он работает стандартным operator(), а с транспонированной - функцией GetElementOfTransposedMatrix, как говориться за всё надо платить, но матрица транспонируется без какой-либо манипуляции с элементами.
Кстати, почему если имеется заголовочный файл .h и файл реализации .cpp, в котором объявлены inline - функции - возникает ошибка линкования, а когда файл .cpp слит в .h - всё в порядке (в единую область видимости файла).
Ответить с цитированием
  (#4 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию А вот так! - 07.09.2003, 21:39

В стареньком BC3.1 есть такая штука - получить ассемблерный выход.
(по-моему tcc.exe /E) Попробуй написать два варианта и посмотреть,
что выдает компилятор. Но по-моему, разницы НЕ БУДЕТ, ибо например, код
Код:
char s[] = "qwerty";
for (char *i = s; *i; i++)
  cout <<i;
РАВНОСИЛЕН!! следующему:
Код:
char s[] = "qwerty";
for (int i = 0; s[i]; i++)
  cout <<s[i];
в чем я и убедился таким способом. И вообще, известно, что
a[i] РАВНОСИЛЬНО (компилятор дает один код) *(a+i)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение критерия делимости MegaZoiCh Вопросы начинающих программистов 1 20.02.2012 01:19
подключил интернет 8 мбит я так понимаю скорость должна быть 1 Мбайт/с а скорость 106 spooky Сетевые подключения 8 01.05.2011 20:59
Я в качестве «линуксятника» T1grOK LINUX 5 26.04.2011 20:04
Изменится ли качество и скорость игры если заменить DirectX на более новый? vladdro Любые вопросы от новичков 9 06.03.2011 13:11
Если какая то возможность использовать USB флешку как жесткий диск и установить на не obrazum Внешние девайсы 5 17.03.2010 21:48
Денёб в качестве шлюза Komissar Rex Процессоры 1 30.10.2009 16:04
Если это список из трех элементов, в качестве результата должно быть выработано число Sirys Lisp 22 31.03.2009 12:27
Скайп.Будет ли связь если скорость 4КБ ? Технарь Любые вопросы от новичков 5 19.12.2008 11:06
Отражается ли скорость наложения текстур на качестве в играх? НИКОЛАЙ DFKTYNBYJDBX Любые вопросы от новичков 1 25.02.2008 21:50
Как в качестве рисунка на кнопке использовать 32-битные иконки GEV_256 Delphi 3 21.05.2004 19:19



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов