Форум программистов, компьютерный форум CyberForum.ru

Быстродействие - C++

Восстановить пароль Регистрация
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
25.07.2013, 02:47     Быстродействие #1
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?

C++
1
2
3
4
5
template <typename T>
struct Point
{
    T x, y;
};

C++
1
2
3
4
5
6
7
8
9
template <typename T>
class Point
{
public:
 
// набор методов
 
T x, y;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Flassie
181 / 166 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
25.07.2013, 03:50     Быстродействие #2
а почему бы не сделать:
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
struct Point
{
    T x, y;
};
 
class Example
{
   Point p;
}
Уверен, что быстрее будет использовать лишь структуру с парой переменных, а не класс со всеми его функциями и переменными
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
25.07.2013, 03:59     Быстродействие #3
Да чото мне кажется, что по скорости одинаково работать будут, методы вроде как заново не копируются, вес объекта что в первом случае и что с методами должен быть одинаковый, значит и по скорости одинаково должно работать.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
25.07.2013, 04:05  [ТС]     Быстродействие #4
Flassie, Вы не совсем поняли. Это реализация одного и того же, но в первом случае - голая структура, с которой каждый раз работают лишь как с хранилищем для 2х переменных, либо класс с набором методов для работы с этими 2мя переменными.

Пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Point
{
    float x, y;
};
 
void foo()
{
    Point p1, p2 = {3, 4};
    p1.x = 5;
    p1.y = 10;
    if(p1.x == p2.x && p1.y == p2.y)
    {
    // ...
    } else {
    // ....
    }
}
либо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Point
{
public:
    Point(float __x = 0, float __y = 0){ operator()(__x, __y); }
    Point& operator()(float __x, float __y){ x = __x; y = __y; return *this; }
    bool operator==(const Point &p){ return x == p.x && y == p.y; }
    float x, y;
};
 
void foo()
{
    Point p1, p2(3, 4);
    p1(1, 2);
    if(p1 == p2){} else {}
}
Добавлено через 3 минуты
ninja2, а как же временные переменные? Это будет работать с одинаковой скоростью?

C++
1
2
3
4
// для структуры
Point p1, p2, p3;
p1.x = p2.x + p3.x;
p1.y = p2.y + p3.y;
C++
1
2
3
4
5
// для класса
Point p1, p2, p3;
p1 = p2 + p3;
 
Point Point::oprator+(const Point &p){ return Point(x + p.x, y + p.y); }
Flassie
181 / 166 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
25.07.2013, 04:07     Быстродействие #5
Кликните здесь для просмотра всего текста
Цитата Сообщение от Kgfq Посмотреть сообщение
Flassie, Вы не совсем поняли. Это реализация одного и того же, но в первом случае - голая структура, с которой каждый раз работают лишь как с хранилищем для 2х переменных, либо класс с набором методов для работы с этими 2мя переменными.
Пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Point
{
float x, y;
};
void foo()
{
  Point p1, p2 = {3, 4};
  p1.x = 5;
  p1.y = 10;
  if(p1.x == p2.x && p1.y == p2.y)
   {
   // ...
   } else {
   // ....
   }
}
либо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Point
{
public:
   Point(float __x = 0, float __y = 0){ operator()(__x, __y); }
   Point& operator()(float __x, float __y){ x = __x; y = __y; return *this; }
   bool operator==(const Point &p){ return x == p.x && y == p.y; }
   float x, y;
};
void foo()
{
   Point p1, p2(3, 4);
   p1(1, 2);
   if(p1 == p2){} else {}

Разницы никакой в быстродействии не будет
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.07.2013, 10:23     Быстродействие #6
Цитата Сообщение от Kgfq Посмотреть сообщение
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?
Ключ компиляции -O2, никогда не брать адреса элементов структуры, и помогать компилятору векторизировать вычисления.

Все эти ручные инлайнинги бесполезны, компилятор и сам всё повстраивает.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
25.07.2013, 10:57     Быстродействие #7
Чтобы программа быстро работала, нужно ее вначале хорошо продумать. Нужно понимать, что юзабилити и производительность плохо совместимы, поэтому внимание нужно акцентировать сразу на производительности, а не на удобстве использования. Затем ,после написания программы, взять анализатор производительности, вычислить самую затратную функцию - оптимизировать ее, уменьшив кол-во выделений памяти, векторизовать вычисления. Это дело провести несколько раз со всеми затратными функциями, далее если возможно - распараллетить вычисления(можно с использованием omp или tbb). Ну а затем это все дело нужно долго отлаживать...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2013, 13:54     Быстродействие #8
Цитата Сообщение от Kgfq Посмотреть сообщение
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?
один фиг
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
25.07.2013, 19:54  [ТС]     Быстродействие #9
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
никогда не брать адреса элементов структуры
Поясните, пожалуйста
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.07.2013, 21:41     Быстродействие #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Поясните, пожалуйста
Позволяет компилятору с честной совестью засовывать эти координаты в регистры всегда, когда регистров хватает. В идеале вообще всегда, когда они нужны.
Dr_Quake
Заблокирован
25.07.2013, 22:19     Быстродействие #11
Kgfq, посмотреть во что соберёт это компилятор с разными -O , сдаётся мне, достаточно будет какого-то уровня, когда перестанет вызывать get/set методы класса вместо прямого обращения и они как минимум будут равны.
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 982
Регистрация: 02.05.2013
Сообщений: 10,298
Завершенные тесты: 1
25.07.2013, 22:22     Быстродействие #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
template <typename T>
struct Point1
{
    volatile T x, y;
};
 
template <typename T>
class Point2
{
public:
 void set(T x, T y)
 {
     this->x = x;
     this->y = y;
 }
 
 T get_x() const
 {
     return x;
 }
 
 T get_y() const
 {
     return y;
 }
 
private:
 volatile T x, y;
};
 
 
 
int main()
{
    Point1<int> p1;
    p1.x = 100;
    p1.y = 200;
 
    int const r1 = p1.x + p1.y;
 
    Point2<int> p2;
    p2.set(300, 400);
 
    int const r2 = p2.get_x() + p2.get_y();
 
    return r1 + r2;
}
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
_main   PROC
; 34   : {
 
    push    ebp
    mov ebp, esp
    sub esp, 8
 
; 35   :     Point1<int> p1;
; 36   :     p1.x = 100;
 
    mov DWORD PTR _p1$[ebp], 100        ; 00000064H
 
; 37   :     p1.y = 200;
 
    mov DWORD PTR _p1$[ebp+4], 200      ; 000000c8H
 
; 38   : 
; 39   :     int const r1 = p1.x + p1.y;
 
    mov edx, DWORD PTR _p1$[ebp+4]
    add edx, DWORD PTR _p1$[ebp]
 
; 13   :      this->x = x;
 
    mov DWORD PTR _p2$[ebp], 300        ; 0000012cH
 
; 14   :      this->y = y;
 
    mov DWORD PTR _p2$[ebp+4], 400      ; 00000190H
 
; 15   :  }
; 16   : 
; 17   :  T get_x() const
; 18   :  {
; 19   :      return x;
 
    mov eax, DWORD PTR _p2$[ebp]
 
; 20   :  }
; 21   : 
; 22   :  T get_y() const
; 23   :  {
; 24   :      return y;
 
    mov ecx, DWORD PTR _p2$[ebp+4]
 
; 40   : 
; 41   :     Point2<int> p2;
; 42   :     p2.set(300, 400);
; 43   : 
; 44   :     int const r2 = p2.get_x() + p2.get_y();
 
    add eax, ecx
 
; 45   : 
; 46   :     return r1 + r2;
 
    add eax, edx
 
; 47   : }
И к гадалке не ходи
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 22:29     Быстродействие
Еще ссылки по теме:

Построить график зависимости от быстродействие циклических операторов C++
C++ Быстродействие std::swap
C++ Быстродействие операции умножения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dr_Quake
Заблокирован
25.07.2013, 22:29     Быстродействие #13
С volatile слишком очевидно. Всё-таки интереснее что будет при формулировке ТСа
Yandex
Объявления
25.07.2013, 22:29     Быстродействие
Ответ Создать тему
Опции темы

Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru