Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/72: Рейтинг темы: голосов - 72, средняя оценка - 4.74
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
1

Производительность операций

20.11.2011, 06:34. Показов 13788. Ответов 135
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не уверен в своих силах для самостоятельной оценки сабжа. Где можно найти информацию о производительности стандартных операций с++ (гуглением не справился, нашел только сравнение реализации на с++, джаве и на нескольких интерпретируемых языках)?
То есть интересует информация плана << : * как 1:15 или <= : == как 25:24... То есть, чрезвычайно интересно знать, какие операции выбирать если есть альтернатива.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2011, 06:34
Ответы с готовыми решениями:

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100
Вычисления проводятся слева-направо, ни одна операция не имеет приоритета. Добавлено через 2...

Производительность
Подскажите, где или что почитать о том, как писать БЫСТРЫЕ программы? (про разработку...

Заменить в данной строке знаки арифметических операций названиями противоположных им операций
Заменить в данной строке знаки арифметических операций названиями противоположных им операций.

Доказать равенства, используя свойства операций над множествами и определения операций
Доказать равенства, используя свойства операций над множествами и определения операций. Дальше...

135
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
21.11.2011, 18:27  [ТС] 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от LosAngeles Посмотреть сообщение
результат rdtsc помещается в пару edx:eax на ia32, а на intel64
кстати да,ведь у меня 32х-разрядное приложение сейчас запускается...
0
Заблокирован
21.11.2011, 18:28 42
taras atavin,
хаха lol! Ещё один эксперт по вопросам оптимизации объявился...
C++
1
2
3
4
5
6
7
8
9
10
11
12
    i = i + 1;
011E14BC  mov         eax,dword ptr [i]  
011E14BF  add         eax,1  
011E14C2  mov         dword ptr [i],eax  
    i++;
011E14C5  mov         eax,dword ptr [i]  
011E14C8  add         eax,1  
011E14CB  mov         dword ptr [i],eax  
    ++i;
011E14CE  mov         eax,dword ptr [i]  
011E14D1  add         eax,1  
011E14D4  mov         dword ptr [i],eax
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.11.2011, 18:29 43
Много всего неразумного
[QUOTE=taras atavin;2196816]Например,
C++
1
x=x+1;
медленнее, чем
C++
1
x++;
C++
1
x++;
медленнее, чем
C++
1
++x;
,
C++
1
x=x+b;
вроде бы медленнее, чем
C++
1
x+=b;
,
C++
1
x=x-1;
медленнее, чем
C++
1
x--;
C++
1
x--;
медленнее, чем
C++
1
--x;
,
C++
1
x=x-b;
вроде бы медленнее, чем
C++
1
x-=b;
C++
1
x=x*b;
медленнее, чем
C++
1
x*=b;
,
C++
1
x*=2;
медленнее, чем
C++
1
x+=x;
, умножение медленнее сложения, но не столько, чтоб выполнять такую замену при любом множителе, кроме двух, но если стоит выбор, два раза умножить и сложить произведения, или сначала сложить, а потом один раз умножить, то лучше один раз умножить, то есть
C++
1
x=a*b+a*d;
медленее, чем
C++
1
x=a*(b+d);
,
C++
1
x=x/b;
медленнее, чем
C++
1
x/=b;
. Сдвиги быстрее, чем деление/умножение на степени двойки.

Знатоки подтягиваются
0
Заблокирован
21.11.2011, 18:29 44
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Скорость работы с вектором. Не считаю я что получать указатель на первый элемент и работать с ним это правильно.
У вас там добавление в конец:

Цитата Сообщение от ForEveR Посмотреть сообщение
vec.push_back(i);
Везде - просто оператор=, а в случае с вектором - не факт что нет реалока.

Что касается указателя вместо итератора - для критичного к скорости места вполне себе приемлемо.

Можно тайпдефом замаскировать под итератор для особо привередливых
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.11.2011, 18:30 45
Цитата Сообщение от Bers Посмотреть сообщение
Что касается указателя вместо итератора - для критичного к скорости места вполне себе приемлемо.
Некрасиво же
У вас там добавление в конец:
Надо reserve добавить.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:30 46
Кстати, CEBEP, как ты вообще измеряешь время исполнения отдельных операторов? Ведь без точного времени исполнения непосредственно сравниваемых операторов нельзя получить коэффициенты.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.11.2011, 18:31 47
Bers, Есть реаллок. Ну если одним куском памяти примерно одинаковая скорость будет.
C++
1
2
3
4
5
6
7
8
   auto now = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
   std::vector<int> vec(size);
   for (size_t i = 0; i < size; ++i)
   {
      vec[i] = i;
   }
   std::cout << "Vector time: " << (chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now())
            - now).count() << std::endl;
forever@pterois:~/My_pro1/cpp_pro$ ./file
Vector time: 4
Array time: 3
Pointer time: 1
0
Заблокирован
21.11.2011, 18:32 48
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Есть реаллок. Ну если одним куском памяти примерно одинаковая скорость будет.
но если примерно одинаковая скорость будит, значит вектор работает примерно одинакова
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
21.11.2011, 18:35  [ТС] 49
Цитата Сообщение от taras atavin Посмотреть сообщение
од C++
x*=2;
медленнее, чем
x+=x;
а если отчебучить что-нибудь типа x = x << 1? Я к тому, что просто список что быстрее а что нет и так ясен - я расставил операции в эксперименте так, что всегда отношение или больше или близко к 1 с первого раза. Хочется знать именно отношение

Цитата Сообщение от taras atavin Посмотреть сообщение
Итераторы бывают разные.
Да, я видел в официальных источниках упоминания о том, что иногда они - просто T*, а иногда - вспомогательный класс. Дело в том, что мы практически наверняка будем компилировать всё на VisualStudio ещё очень долгое время, знание того, как поведёт себя именно она - в принципе достаточно. Да и тема такая, что для всех компиляторов её не исчерпать да и вряд ли это разумно.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:35 50
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть поднятый вами вопрос и то, как вы подощли к его решению, не представляет никакого интереса для профессиональных программистов..
Этим ты показал свой непрофессионализм. Вопрос как раз актуален при ручной оптимизации, сомнителен же только подход.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.11.2011, 18:36 51
Цитата Сообщение от CEBEP Посмотреть сообщение
что-нибудь типа x = x << 1
Ну что же Вы так... временная копия же создается
C
1
x <<= 1;
0
Заблокирован
21.11.2011, 18:37 52
Цитата Сообщение от fasked Посмотреть сообщение
Некрасиво же
Просто есть два типа людей:

1. Первые, если нужно увеличить производительность, находят самые упоротые алгоритмы, и заменяют их на более быстрые.

2. Вторые, вместо индексов массивов начинают юзать указатели, а вместо i++ писать ++i


Если у первых не получается улучшить производительность, то они начинают смотреть на дата-ориентированное программирование, и в сторону таких языков, как СИ.

У вторых ничего не получается в принципе. Потому что вся эта хрень - экономия на спичках.
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
21.11.2011, 18:38  [ТС] 53
Цитата Сообщение от taras atavin Посмотреть сообщение
время исполнения отдельных операторов?
кладу в а время перед исполнением первого, исполняю первый, сразу после кладу время в b, потом выполняю второй, кладу время в c. теперь b - a = время выполнения первого, c - b = второго.
0
Заблокирован
21.11.2011, 18:39 54
Цитата Сообщение от taras atavin Посмотреть сообщение
x=a*b+a*d;
медленее, чем
x=a*(b+d);
только без оптимизации разумеется, в дебаг версии да, на то оно и дебаг, компилятор прямолинеен. С -O3 и это утверждение будет неверным разумеется, а скорее всего и с -О1
Вобщем всё что ты написал неверно
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
21.11.2011, 18:41  [ТС] 55
Цитата Сообщение от Bers Посмотреть сообщение
экономия на спичках
первый пункт неиллюзорно сложен а книжки по математическим методам в нашей теме уже прочитаны. выдумывать своё - чуть менее чем защитить кандидатскую.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:44 56
Цитата Сообщение от Paporotnik Посмотреть сообщение
и вообще странное противопоставление сложения и умножения...
Это ты странный.
C++
1
x+x
и
C++
1
x*2
- дают один результат за разное время, и выгоднее
C++
1
x+x
, чем
C++
1
x*2
. Но
C++
1
x+x+x
и
C++
1
x*3
тоже дают один результат, а выгоднее
C++
1
x*3
, чем
C++
1
x+x+x
.
0
Заблокирован
21.11.2011, 18:47 57
Цитата Сообщение от taras atavin Посмотреть сообщение
Этим ты показал свой непрофессионализм. Вопрос как раз актуален при ручной оптимизации, сомнителен же только подход.
Я вам советую сначала почитать Герба Саттера "Решение сложных задач на С++", где он как раз говорит про оптимизацию и проходится по таким "профессионалам", как вы, которые занимаются "ручной оптимизацией". Я могу вам на ушко сказать, где "ручная оптимизация" может вам пригодиться!
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:48 58
Цитата Сообщение от ForEveR Посмотреть сообщение
Точно не имеющих?
Ну ка найди в бусте решение для системы 1000*1000. Так вот, это ещё малыш. Я решал 17000*17000.
1
Заблокирован
21.11.2011, 18:48 59
Цитата Сообщение от CEBEP Посмотреть сообщение
первый пункт неиллюзорно сложен
Не нужно изобретать новые паттерны-алгоритмы.

Нужно просто поменять кусок упоротой архитектуры на другой, более быстрый.
Смотришь, какой кусок программы выполняется дольше всех. и думаешь, как его можно оптимизировать. Например, скорость теряется из-за многочисленных левых расчетов - можно на таком участке закэшировать часть данных.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:50 60
Цитата Сообщение от Сыроежка Посмотреть сообщение
Однако в современных микропроцессоров есть векторные модули, которые делают операции умножения очень быстрыми, что не имеет никакого смысла заменять их серией сложений.
Серией? Или заменять удвоение одним сложением? А если выбор между
C++
1
x-a*b+a*c;
и
C++
1
x=a*(b+c);
?
0
21.11.2011, 18:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2011, 18:50
Помогаю со студенческими работами здесь

Доказать равенства, используя свойства операций над множествами и определения операций
Доказать равенства, используя свойства операций над множествами и определения операций. A\subseteq...

Сколько нужно провести операций, чтобы 13 операций подряд были успешными?
Вероятность успешной операции = 63% Сколько нужно провести операций, чтобы 13 операций подряд были...

Доказать равенства, используя свойства операций над множествами и определения операций
Доказать равенства, используя свойства операций над множествами и определения операций. б) ...

Напечатать все знаки арифметических операций и операций отношения
Напечатать все знаки арифметических операций и операций отношения,которые входят в заданый массив и...


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

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