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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.71
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
#1

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

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

Не уверен в своих силах для самостоятельной оценки сабжа. Где можно найти информацию о производительности стандартных операций с++ (гуглением не справился, нашел только сравнение реализации на с++, джаве и на нескольких интерпретируемых языках)?
То есть интересует информация плана << : * как 1:15 или <= : == как 25:24... То есть, чрезвычайно интересно знать, какие операции выбирать если есть альтернатива.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
22.11.2011, 08:43     Производительность операций #101
Либо я чего то не понимаю. Либо вы чего то не понимаете.


Пофигу, скольков ремени тратит XOR AX,AX;
Главное, что бы это время было константным.

Больше ничего не требуется, для оценки производительности исходного кода.
Скомпилировал, и оценил ассемблированный код. Все!
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 08:52     Производительность операций #102
Цитата Сообщение от Bers Посмотреть сообщение
Я конечно, не разбираюсь в ассемблере, но по моему это очивидно, не?
Абсолютно не очевидно, но часто верно. Для такого вывода надо знать, что есть дальние и ближние переходы, что разные операции перехода выполняются за разное время, что если ты не уложился в дальность ближнего перехода, то будет дальний, что есть кэш, что он работает на повыешонной в сравнении с оперативкой частоте, что большие куски кода в кэш тупо не влезают и много чего ещё. Часто больший по размеру код оказывается быстрее за счёт более быстрых операций. Какой цикл с чёным числом шагов меньше весит? Где все шаги явные, или где вместо одного тела цикла имеется два его экземпляра? Так вот, иногда быстрее второй вариант, а меньше всегда первый. Часто быстрее больший код с тормозными операциями, но работающий с более компактными данными. Вообще нет общих правил оптимизации по времени, кроме:
1. Избегайте сравнения в цикле с чем бы то ни было, кроме ноля. Но только если это не ведёт к усложнению тела цикла.
2. Избегайте постфиксной формы инкремента/декремента.
3. Избегайте мультипликативных операций везде, где это не ведёт к увеличению общего числа операций.
4. Избегайте вычислений с плавающей запятой везде, где их можно без усложнения алгоритма заменить целочисленными.
5. Избегаейте передачи больших объектов по значению.
6. Избегайте рекурсии везде, где она не вытекает из самой задачи, или из структуры данных. Неоправданная рекурися ведёт к тормозам, но там, где она вытекает из задачи, или из структуры данных, любая попытка избавить от неё ведёт к усложеннию алгоритма и может привести к ещё большим тормозам.
Всё остальное делается с кучей тестов и замерами времени. В том числе, пробуют как экономить размер кода, так и несколько его раздувать, менять представление данных, используют априорную информацию о структуре матриц коэффициентов систем уравнений для оптимизации на уровне алгоритма.
Bers
Заблокирован
22.11.2011, 08:54     Производительность операций #103
taras atavin, похоже вы в танке.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:01     Производительность операций #104
Цитата Сообщение от Bers Посмотреть сообщение
Пофигу, скольков ремени тратит XOR AX,AX;
Главное, что бы это время было константным.
Время исполнения конкретно XOR AX,AX; констана, но не время исполнения абстрактной операции в расчёте на операцию, или на байт кода этой операции. А так как нет ни константы для времени исполнения одной абстравтной операции, ни константного множителя от длины кода, то замеры веса асемблерного кода не имеют значения вообще. Для оптимизации важны тесты.

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
taras atavin, похоже вы в танке.
Броня между нами, факт. Но в танке не я. Кстати, ТС наглядно продемострировал, что сложение быстрее умножения. Но точного алгорима умножения не знаем ни он, ни я. У нас получается суперкривое умножение, в десятки раз отстающее от сложения, фирма же сделала лучше.
Bers
Заблокирован
22.11.2011, 09:02     Производительность операций #105
Цитата Сообщение от taras atavin Посмотреть сообщение
Время исполнения конкретно XOR AX,AX; констана, но не время исполнения абстрактной операции в расчёте на операцию, или на байт кода этой операции.
Так оценивать то нужно не коня в сферическом вакуме!
А конкретную команду, с её конкретными аргументами!

Оценить вес XOR с её аргументами, и других прочих ассемблированных команд вполне реальная задача.

А следовательно - можно получить абсолютные оценки производительностей алгоритмов, вместо грубых приблизительных расчетов завязанных на времени.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:08     Производительность операций #106
Цитата Сообщение от Bers Посмотреть сообщение
Так оценивать то нужно не коня в сферическом вакуме!
А конкретную команду, с её конкретными аргументами!
Слава те господи, дошло до него наконец.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
22.11.2011, 09:09  [ТС]     Производительность операций #107
Bers, я не понимаю, почему вы уверены, что размер откомпилированного кода прямо пропорционален времени, необходимому на его исполнение.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:10     Производительность операций #108
Цитата Сообщение от Bers Посмотреть сообщение
Оценить вес XOR с её аргументами, и других прочих ассемблированных команд вполне реальная задача.
Опыть вес. Вес слабо связан со временем, задача же - съэкономить время.
Thinker
Эксперт C++
4219 / 2193 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.11.2011, 09:11     Производительность операций #109
Цитата Сообщение от CEBEP Посмотреть сообщение
Я ожидал, что извлечение корня дольше чем умножение раз в 20 как минимум, а оказывается всего в 2,5.
Еще бы, когда дело происходит на аппаратном уровне
Bers
Заблокирован
22.11.2011, 09:13     Производительность операций #110
Цитата Сообщение от CEBEP Посмотреть сообщение
Bers, я не понимаю, почему вы уверены, что размер откомпилированного кода прямо пропорционален времени, необходимому на его исполнение.
Потому что вес ассемблированной команды - это и есть условная единица, определяющая количество тактов, которое потребуется процессору на исполнение данной команды.

Может быть правильно сказать, не "команды", а "инструкции"

Вы суть идеи вообще уловили?

Вы осознаете, что очень глупо и очень тупо пытаться оптимизировать исходный код высокого уровня, потому что вы не знаете во что его превратит компилятор.

Оценивать нужно конечный продукт - ассемблированный код, а не высокоуровневую портянку.


Тьху ты, ё-маё. Не размер, а вес.
Блин, я не могу с вами общаться. Я вам про попа, вы мне про Ярему.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:16     Производительность операций #111
Цитата Сообщение от Bers Посмотреть сообщение
А следовательно - можно получить абсолютные оценки производительностей алгоритмов, вместо грубых приблизительных расчетов завязанных на времени.
Как раз по твоей методе нельзя получить вообще ни каких оценок. Небольшое раздувание кода, но при одновременном сокращении размера данных и числа операций может сократить время в десятки миллонов раз, а экономия размера кода за счёт одних лишь более коротких кодов операций - несколько процентов от общего веса самого кода. Оценки же, основанные на времени исполнения команд точны. Только надо брать таблицу числа тактов для каждой команды, читать ассемблерный код после компиляции каждого куска и суммировать такты. Это как раз и даст время исполнения каждого оператора c++, а не замеры по методе ТС. Более мнее приличные замеры получаются для больших функций, занимающих хотябы миллоны тактов, остальные годятся только на качетсвенную оценку.
Bers
Заблокирован
22.11.2011, 09:18     Производительность операций #112
Цитата Сообщение от taras atavin Посмотреть сообщение
Только надо брать таблицу числа тактов для каждой команды, читать ассемблерный код после компиляции каждого куска и суммировать такты. Это как раз и даст время исполнения каждого оператора c++, а не замеры по методе ТС.

Брависсимо! Наконец то! Первый кажется уже начал созревать!
И понимать, что за идею я предложил!

Очень рад, что первый товарищ начал вот уже потихонечку вылезать из танка!
Мои поздравления!
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:23     Производительность операций #113
Bers, твой подход - это типа: "-Что быстрее: съездить на лошади в соседнюю область, или слетатать через океан на конкорде?
-Соседняя область ближе, значит быстрее лошадь". У них скорости разные, а ты пытаешься вывести время из одного лишь расстояния.

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
И понимать, что за идею я предложил!
Я сразу написал, что у ТС соминителен подход к определению искомых коэффициентов. А таблицу тактов использовал ещё в 1995-м. Тогда я по этой таблице отказался от цикла в пользу операции блочного копирования: хоть она и тратила десятки тысячь тактов, но цикл занимал ещё больше тактов.
Bers
Заблокирован
22.11.2011, 09:30     Производительность операций #114
Цитата Сообщение от taras atavin Посмотреть сообщение
Bers, твой подход - это типа: "Что быстрее: съездить на лошади в соседнию область, или слетатать через океан на конкорде? Соседняя область ближе, значит быстрее лошадь". У них скороти разные, а ты пытаешься вывести время из одного лишь расстояния.

Мой подход:

Скорость лошади - 20 км/час, а ехать - 20 км, значит лошадь сделает свою работу за 1 час.

Скорость конкорда - 200 км/час, а лететь за океан - 200 км, значит конкорд долетит за 1 час.

Вес лошади, с её аргументами - 1 час
Вес конкорда с его аргументами - 1 час.

Если бы конкорду нужно было лететь не за 200 км, а только за 20, то его вес был бы 0.1

Я ещё раз повторяю - оценка идёт ассемблированной команды.

Не просто XOR, а с её конкретными аргументами
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:31     Производительность операций #115
Кстати, и этот подход не применим для интерпретируемых языков, так как там просто нет асмблерного кода целевой проги, а только самого интерпретатора.
LosAngeles
Заблокирован
22.11.2011, 09:34     Производительность операций #116
Добавлено через 22 секунды
Цитата Сообщение от CEBEP Посмотреть сообщение
LosAngeles, вы голословны. покажите всё-таки, как убедится в ваших словах
лол! Я даже приводил дизассемблерные листинги "тарасовых оптимизаций". До оптимизации и после они абсолютно идентичны. Даже x*3 и x+x+x абсолютно эквивалентны, x+=1 эквивалентно x = x + 1 и прочие вещи которые он написал абсолютно эквивалентны! Все его оптимизации полный бред и высосаны из пальца, в этом может убедиться любой пятиклассник который откроет visual studio и нажмёт кнопочку "Go to dissasembly", а какие доказательства есть у тараса что x*3 быстрее x+x+x? Ну разумеется никаких!
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 09:52     Производительность операций #117
Цитата Сообщение от Bers Посмотреть сообщение
Скорость конкорда - 200 км/час, а лететь за океан - 200 км, значит конкорд долетит за 1 час.
Два маха, это не истребитель второй мировой. летель через Атлантический и не над проливом. И соседняя область может быть и далшье. Если ты живешь около условной границы, тогда быстрее лошадь, чем тратить время на посадку в самолёт, высадку из него, ожидание взлёта и тому тодобное. Но если на лошшади надо проехать 404 км со скростью 13 км/ч, а на конкорде пролететь 20 000 километров со скоростью 2390, то лошадь отстаёт.

Добавлено через 13 минут
Цитата Сообщение от LosAngeles Посмотреть сообщение
Даже x*3 и x+x+x абсолютно эквивалентны
Одна операция и две, а кто то здесь говорил, что компиляторы не преобразуют математические выражения. Даже отсюда вывод: x*2 медле, чем x+x, так как умножение эквивалентно двум сложениям, а x+x - это односложение, оно в два раза быстрее. Только x+x+x ещё сказывается на размере кода и дальности переходов, большая программа с такой цепочкой будет медленее, чем с умножением. Но ты же утверждаешь, что эквивалентно всё, что я привёл. Получается, включая и удвоение. x*3 и x*2 выполняется за одно время, так как это одна и та же операция. Ты утвреждаешь, что x*2 выполянется за то же врямя, что и x+x, а x*3 - за время x+x+x. Получается, что сложение выполянется вообще мгновенно, что не возможно. Единственно,ч ем можно объяснить такую эквивалентность - это что компилятор оптимизировал x*2 до x+x, а x+x+x до x*3. Не имеет значения, кто выполнил оптимизацию, время исполненяи зависит только от самого рузльтирующего кода. Но если заранее знать, что одна операция медленнее другой, то можно выполнить оптимизацию вручную и гарантирвоать её вне зависимости от настроек автоматической оптимизации.
LosAngeles
Заблокирован
22.11.2011, 09:59     Производительность операций #118
после слов "дальность перехода..." перестал читать, очередная порция отборного бреда, хочешь поспорить с тем что быстрее x*3 или x+x+x? Тогда на, жри:
Assembler
1
2
3
x=a*3;
mov         eax,dword ptr [a] 
lea         eax,[eax+eax*2]
Assembler
1
2
3
x=a+a+a;
mov         eax,dword ptr [a] 
lea         eax,[eax+eax*2]
ещё вопросы есть?
Bers
22.11.2011, 10:06
  #119
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 10:37     Производительность операций
Еще ссылки по теме:

C++ Вычислить суточную производительность каждого полимера
C++ Производительность контейнеров stl для игры
Производительность многопоточности C++
C++ копирование строк, производительность
C++ Сравнительная производительность при использовании синонима или наследования

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 10:37     Производительность операций #120
Цитата Сообщение от LosAngeles Посмотреть сообщение
нажмёт кнопочку "Go to dissasembly"
И где ж такая кнопка?

Добавлено через 7 минут
i=i*2;
Assembler
1
2
3
4
5
6
7
8
000000013FF31399  cmp         byte ptr [rsp+0A8h],0 
000000013FF313A1  jne         WindowMainProcedure+6Fh (13FF313AFh) 
000000013FF313A3  lea         rcx,[__xi_z+220h (13FF3A990h)] 
000000013FF313AA  call        _RTC_UninitUse (13FF33A40h) 
000000013FF313AF  mov         eax,dword ptr [rsp+94h] 
000000013FF313B6  shl         eax,1 
000000013FF313B8  mov         byte ptr [rsp+0A8h],1 
000000013FF313C0  mov         dword ptr [rsp+94h],eax
j=j+j;
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
000000013FAE1399  cmp         byte ptr [rsp+0A8h],0 
000000013FAE13A1  jne         WindowMainProcedure+6Fh (13FAE13AFh) 
000000013FAE13A3  lea         rcx,[__xi_z+220h (13FAEA990h)] 
000000013FAE13AA  call        _RTC_UninitUse (13FAE3A40h) 
000000013FAE13AF  cmp         byte ptr [rsp+0A8h],0 
000000013FAE13B7  jne         WindowMainProcedure+85h (13FAE13C5h) 
000000013FAE13B9  lea         rcx,[__xi_z+220h (13FAEA990h)] 
000000013FAE13C0  call        _RTC_UninitUse (13FAE3A40h) 
000000013FAE13C5  mov         ecx,dword ptr [rsp+94h] 
000000013FAE13CC  mov         eax,dword ptr [rsp+94h] 
000000013FAE13D3  add         eax,ecx 
000000013FAE13D5  mov         byte ptr [rsp+0A8h],1 
000000013FAE13DD  mov         dword ptr [rsp+94h],eax
Что то я не вижу здесь эквивалентности.
Yandex
Объявления
22.11.2011, 10:37     Производительность операций
Ответ Создать тему
Опции темы

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