Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

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

25.07.2013, 02:47. Просмотров 722. Ответов 12
Метки нет (Все метки)

Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?

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;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2013, 02:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Быстродействие (C++):

Быстродействие и БД - C++
Здравствуйте! Пишу программу - библиотеку для работы с электронными книгами (в смысле с файлами). Информация хранится в БД (Access). ...

Быстродействие программы - C++
Доброго времени суток! Была дана задача: программа получает на вход файл, содержащий три строки: 1. Количество чисел в...

Быстродействие процессора? - C++
Ребят заинтересовал вопрос по архитектуре процессора. Что мешает повысить быстродействие процессора за счет увеличения количества...

Быстродействие операции умножения - C++
что будет выполняться быстрее? x=y*z;или Fun_Plu(int y,int z); { int x=0; for(int i=0;i&lt;z;i++) x=y+x; return x; }

Быстродействие std::swap - C++
Добрый день форумчане! Недавно тестил различные алгоритмы сортировки и заметил такую штуку: Возьмем к примеру обычный пузырек на 10000...

Определить быстродействие программы - C++
Подскажите пожалуйста балвану) а есть какой-нибудь модуль/программа, чтобы определить быстродействие программы?

12
Flassie
182 / 167 / 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;
}
Уверен, что быстрее будет использовать лишь структуру с парой переменных, а не класс со всеми его функциями и переменными
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
25.07.2013, 03:59 #3
Да чото мне кажется, что по скорости одинаково работать будут, методы вроде как заново не копируются, вес объекта что в первом случае и что с методами должен быть одинаковый, значит и по скорости одинаково должно работать.
0
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); }
0
Flassie
182 / 167 / 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 {}

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

Все эти ручные инлайнинги бесполезны, компилятор и сам всё повстраивает.
0
nonedark2008
964 / 704 / 157
Регистрация: 28.07.2012
Сообщений: 1,934
25.07.2013, 10:57 #7
Чтобы программа быстро работала, нужно ее вначале хорошо продумать. Нужно понимать, что юзабилити и производительность плохо совместимы, поэтому внимание нужно акцентировать сразу на производительности, а не на удобстве использования. Затем ,после написания программы, взять анализатор производительности, вычислить самую затратную функцию - оптимизировать ее, уменьшив кол-во выделений памяти, векторизовать вычисления. Это дело провести несколько раз со всеми затратными функциями, далее если возможно - распараллетить вычисления(можно с использованием omp или tbb). Ну а затем это все дело нужно долго отлаживать...
0
Jupiter
Каратель
Эксперт С++
6565 / 3986 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2013, 13:54 #8
Цитата Сообщение от Kgfq Посмотреть сообщение
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?
один фиг
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
25.07.2013, 19:54  [ТС] #9
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
никогда не брать адреса элементов структуры
Поясните, пожалуйста
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.07.2013, 21:41 #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Поясните, пожалуйста
Позволяет компилятору с честной совестью засовывать эти координаты в регистры всегда, когда регистров хватает. В идеале вообще всегда, когда они нужны.
0
Dr_Quake
Заблокирован
25.07.2013, 22:19 #11
Kgfq, посмотреть во что соберёт это компилятор с разными -O , сдаётся мне, достаточно будет какого-то уровня, когда перестанет вызывать get/set методы класса вместо прямого обращения и они как минимум будут равны.
0
Убежденный
Ушел с форума
Эксперт С++
15786 / 7223 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 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   : }
И к гадалке не ходи
0
Dr_Quake
Заблокирован
25.07.2013, 22:29 #13
С volatile слишком очевидно. Всё-таки интереснее что будет при формулировке ТСа
0
25.07.2013, 22:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 22:29
Привет! Вот еще темы с ответами:

Измерить быстродействие методов сортировки - C++
Нужно измерить время работы различных методов сортировки , но не имею понятия как указателями перенести значения массива для каждого метода...

Построить график зависимости от быстродействие циклических операторов - C++
Построить график зависимости от быстродействие циклических операторов for и while. Подскажите как он должен выглядеть??

Быстродействие программы при использовании статических и динамических библиотек - C++
Всем привет! Понимаю, что вопрос простой... но не могу, не получить экспертного мнения. Правильно ли я понимаю, что программы, которые...

Можно ли увеличить быстродействие программы по поиску простых чисел? - C++
Я составил для себя программу, ищущую простые числа. Мне удалось довести её до следующей скорости: На Ubuntu 12.04 числа в пределах...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.