74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
1

Быстродействие

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2013, 02:47
Ответы с готовыми решениями:

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

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

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

Быстродействие кода на C++
Здравствуйте. Есть 2 тестовых кода: 1 на C++, другой на Python. Код на питоне выполняется быстрее,...

12
187 / 172 / 38
Регистрация: 03.08.2012
Сообщений: 596
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
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
25.07.2013, 03:59 3
Да чото мне кажется, что по скорости одинаково работать будут, методы вроде как заново не копируются, вес объекта что в первом случае и что с методами должен быть одинаковый, значит и по скорости одинаково должно работать.
0
74 / 37 / 3
Регистрация: 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
187 / 172 / 38
Регистрация: 03.08.2012
Сообщений: 596
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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.07.2013, 10:23 6
Цитата Сообщение от Kgfq Посмотреть сообщение
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?
Ключ компиляции -O2, никогда не брать адреса элементов структуры, и помогать компилятору векторизировать вычисления.

Все эти ручные инлайнинги бесполезны, компилятор и сам всё повстраивает.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
25.07.2013, 10:57 7
Чтобы программа быстро работала, нужно ее вначале хорошо продумать. Нужно понимать, что юзабилити и производительность плохо совместимы, поэтому внимание нужно акцентировать сразу на производительности, а не на удобстве использования. Затем ,после написания программы, взять анализатор производительности, вычислить самую затратную функцию - оптимизировать ее, уменьшив кол-во выделений памяти, векторизовать вычисления. Это дело провести несколько раз со всеми затратными функциями, далее если возможно - распараллетить вычисления(можно с использованием omp или tbb). Ну а затем это все дело нужно долго отлаживать...
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.07.2013, 13:54 8
Цитата Сообщение от Kgfq Посмотреть сообщение
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто?
один фиг
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
25.07.2013, 19:54  [ТС] 9
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
никогда не брать адреса элементов структуры
Поясните, пожалуйста
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.07.2013, 21:41 10
Цитата Сообщение от Kgfq Посмотреть сообщение
Поясните, пожалуйста
Позволяет компилятору с честной совестью засовывать эти координаты в регистры всегда, когда регистров хватает. В идеале вообще всегда, когда они нужны.
0
Заблокирован
25.07.2013, 22:19 11
Kgfq, посмотреть во что соберёт это компилятор с разными -O , сдаётся мне, достаточно будет какого-то уровня, когда перестанет вызывать get/set методы класса вместо прямого обращения и они как минимум будут равны.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 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
Заблокирован
25.07.2013, 22:29 13
С volatile слишком очевидно. Всё-таки интереснее что будет при формулировке ТСа
0
25.07.2013, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2013, 22:29
Помогаю со студенческими работами здесь

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

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

Быстродействие многопоточного приложения
Здравствуйте. Я работаю сисадмином и по совместительству неплохо знаю C++ ( не гуру, но все же)....

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

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

Сортировка массивов: оценить быстродействие разных методов
Написать программу, в которой реализуются различные методы сортиров¬ки (для одинаковых массивов...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru