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

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

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

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

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

Не уверен в своих силах для самостоятельной оценки сабжа. Где можно найти информацию о производительности стандартных операций с++ (гуглением не справился, нашел только сравнение реализации на с++, джаве и на нескольких интерпретируемых языках)?
То есть интересует информация плана << : * как 1:15 или <= : == как 25:24... То есть, чрезвычайно интересно знать, какие операции выбирать если есть альтернатива.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2011, 06:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Производительность операций (C++):

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

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

Производительность кода - C++
Интересует сабж как таковой, и конкретно это: std::string STR = &quot;ABC&quot;; if ( strcmp(STR.c_str(), &quot;ABC&quot; ) == 0 ) или std::string STR...

Влияет ли на производительность - C++
Влияет ли на производительность определение(тоесть реализация) функций внутри класса, а также использование вложенных классов?

Производительность многопоточности - C++
Доброго времени суток. Решил заняться многопоточностью, и натолкнулся на непонимание с производиельность Есть код в 2 потока: ...

Производительность DLL - C++
Привет всем, у меня вопрос по производительности подключения DLL-ки по сравнению с чтением из файла. В программе использую небольшую...

135
Сыроежка
Заблокирован
21.11.2011, 18:52 #61
Цитата Сообщение от LosAngeles Посмотреть сообщение
taras atavin. Вобщем всё что ты написал неверно
Вот с этим трудно не согласиться!
Я постоянно говорю, что всякие дилетанты очень агрессивны! И это всегда подтверждается!
0
LosAngeles
Заблокирован
21.11.2011, 18:52 #62
Цитата Сообщение от taras atavin Посмотреть сообщение
тоже дают один результат, а выгоднее
1 x*3
, чем
1 x+x+x
неправда, существует такой приём, как быстрое умножение с помощью lea
lea eax,[eax+eax*2]
eax = eax*3

чем компилятор и воспользуется и в случае сложения и в случае умножения. В данном случае выигрыш идёт от того что используется блок адрессации, а не алу
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 18:56 #63
Цитата Сообщение от Сыроежка Посмотреть сообщение
Поэтому я и говорю, что для профессионалов ваш подход и ваши оценки не представяют инетреса. Они интересны лишь из любопытства для новичков, которые узнали, что существует разница между постинкрементом и прединкрементом и ринулиьс это сразу же проверять.
Как раз только новичку интересны твои теории о современных мощностях компиляторов. А профессионалу интересна любая разница между сложением и умножением, даже на доли процента.

Добавлено через 2 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
Однако в современных микропроцессоров есть векторные модули, которые делают операции умножения
Векторные операции - это одна операция с нескольким парами аргументов, вариант параллельных вычислений на некоторых однопроцесорных (и одноядерных) суперкомпьютерах. Ни какого отношения к соотношению скорости сложения и умножения не имеет.
0
Сыроежка
Заблокирован
21.11.2011, 18:57 #64
Цитата Сообщение от taras atavin Посмотреть сообщение
Серией? Или заменять удвоение одним сложением? А если выбор между
C++
1
x-a*b+a*c;
и
C++
1
x=a*(b+c);
?
Я вам расскажу, как компиляторы делали умножения! Если на процессоре умножение выполняется медленнее, чем серия сложений, то разработчики компилятора писали встроенную функцию для умножения. Компилятор не заниается преобразованием выражений. Это вообще чревато возникновению аппаратных исключений из-за возможных переполнений на некоторых архитектурах.
Вам сначала следует почитать стандарт языка С++ и об абстрактной вычислительной машине языка С++, прежде чем рассуждать. В стандарте есть пример того, как преобразование выражений может привести к различным результатам!
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
21.11.2011, 18:59  [ТС] #65
Цитата Сообщение от Bers Посмотреть сообщение
Нужно просто поменять кусок упоротой архитектуры на другой, более быстрый.
программа сейчас выполняется примерно сутки. Чтобы она выполнилась с точностью, необходимой для производства, нужно 10-15 суток. Основное время на решение СЛАУ. Ещё раньше долго производилась работа с жестким диском, но внешний рейд на 8 хардов уверено решил проблему. И дело даже не в том что оно куда больше 1000х1000, а в том, что её можно решить быстрее чем СЛАУ общего вида и мы это делаем. Лишнего ничего нет. Именно для этого мы перешли на с/с++, раньше прогая на MatLabе было ни очень в этом плане. Используя программирование как прикладную технологию, мы разобрались с алгоритмами, но с языком разобраться тоже надо. Вообще этот, характерный дух бадуна, когда кому-то что-то вшторило в похмельном мареве и он пошел постить на форум здесь неуместен. Мы обстоятельно решаем свои задачи, а подобные вопросы решаем, потому, что дело дошло до необходимости покупать дорогое железо, и делать это не хочется. И во время уложится тоже надо-бы.
0
Сыроежка
Заблокирован
21.11.2011, 19:03 #66
Цитата Сообщение от taras atavin Посмотреть сообщение
Как раз только новичку интересны твои теории о современных мощностях компиляторов. А профессионалу интересна любая разница между сложением и умножением, даже на доли процента.

Добавлено через 2 минуты
Векторные операции - это одна операция с нескольким парами аргументов, вариант параллельных вычислений на некоторых однопроцесорных (и одноядерных) суперкомпьютерах. Ни какого отношения к соотношению скорости сложения и умножения не имеет.
Да не смешите! Вы лишь демонстрируете полное дилетанство! Для расширения своего кругозора почитайте об архитектуре IBM mainframe серии Z и об ее векторных вычислениях.

Более того вся ваша "ручная оптимизация" может иметь прямо противположный результат при переходе с одной платформы на другую, где совершенно другой набор команд!

Оптимизацией надо заниматься, когда программа корректно написано, и профайлер показывает узкие места.
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
21.11.2011, 19:03  [ТС] #67
Цитата Сообщение от taras atavin Посмотреть сообщение
Серией? Или заменять удвоение одним сложением?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я вам расскажу, как компиляторы делали умножения!
Ну вот для этого то уж точно никаких экспериментов проводить не надо. написать a*(c+b) и забыть.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:04 #68
Цитата Сообщение от Paporotnik Посмотреть сообщение
расчете кривых в авиационном деле
Правильно, отдельно с однократным расчётом даже замороченного сплайна справится даже i80286. Я делал прогу для металлургического завода и избегал не только умножений (причём, без фанатизма, если множитель дробный, или больше трёх, то использовал именно умножение, а если второй множитель вычисляемый, но сохранению не подлежит, то и удвоение не заменял, но вместо двух умножений на один множитель с последующим сложением произведений умножал сумму), но и все циклы делал по префиксному декременту.
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
21.11.2011, 19:08  [ТС] #69
Цитата Сообщение от Сыроежка Посмотреть сообщение
mainframe
ну у нас пока не на столько жесткие вычисления же)))

Добавлено через 3 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
Герба Саттера "Решение сложных задач на С++"
Скачал.
0
Bers
Заблокирован
21.11.2011, 19:09 #70
CEBEP, я как то не очень хорошо понял ваш эпус о рейде на харды. Вы не могли бы свои мысли как то более корректно выражать?
0
Сыроежка
Заблокирован
21.11.2011, 19:10 #71
[QUOTE=taras atavin;2196942]Как раз только новичку интересны твои теории о современных мощностях компиляторов. А профессионалу интересна любая разница между сложением и умножением, даже на доли процента.

Не интересны профессионалу ваши высосанные из пальца доли процента между сложением и умножением. Не занимаются этим профессиональные программисты! Этой мышиной возней занимаются лишь дилетанты и новички, которым это просто интересно из любопытства.

Профессионалы хорошо понимают, что их код может выполняться на разных патформах, и что на одной платформе то, что вы называете "оптимизацией", будет тормозом.
Более того процессоры постоянно меняются, совершенствуются, выпускаются новые модели с новыми характеристиками. Поэтому профессионалы такой глупостью не занимаются, тем более в наше время, когда мощность процессоров удваивается, если я не ошибаюсь, чуть ли не каждые два года! Процесс развития программного обеспечения идет не поп пути вашей надуманной оптимизации операции умножения, а по пути наращивания аппаратных средств.

Я вас уверяюю, что никто из разработчиков Windows не занимается той ерундой, которой занимаетесь вы. Если и делают оптимизацию, то на уровне компилятора, то есть на уровне генерации объектного кода. А далее пользуются этим компилятором и не засоряют себе голову вопросами умножения и сложения.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:15 #72
Цитата Сообщение от CEBEP Посмотреть сообщение
стоит ли переписать обращения по индексам в указатели
Что такое обращение по индексу знаешь? Это вычисление указателя + доступ по указателю, то есть
C++
1
x=a[i];
означает
C++
1
2
{temp=a+i;
x=*temp;}
, что медленнее, чем получить его в заголовке инкрементом, заменяющим другой инкремент, а потом использовать, но в циклах многократно выполняется сравнение, а сравнение с нолём быстрее, чем с чем бы то ни было, так что если ты можешь переписать заголовок на сравнение с нолём (например,
C++
1
for (i=n; i>0; --i)
), то я не скажу что быстрее: один раз на шаг обратиться по индексу, или по указателю. Но таких обращений на один шаг цикла много, то точно лучше указатель. Если же у тебя наоборот однократное обращение к элементу безо всякого цикла, то используй индекс, он в этом случае не медленнее, чем заводить явный указатель.
1
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
21.11.2011, 19:26  [ТС] #73
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое обращение по индексу знаешь?
Да, я знал именно то, что вы повторили.
просто, на мой взгляд, перебор типа for(doulbe* it = &vectorOfNumbers[0], end = it + vectorOfNumbers.size(); it != end; ++it) - довольно грубая штука, и прежде чем ей пользоваться, нужно наверняка знать, на сколько это быстрее. Вообще я удивляюсь тому, на сколько все убеждены в том, что, скажем a * b + a * c будет записано как a * (b + c), при этом не предпологая, что перебор for(int i = 0; i != vectorOfNumbers.size(); ++i) не будет преобразован к приведённому мной выше. Я где-то видел, что цикл сложений написанный в результате неправильного понимания алгоритма (реально в коде был написан for) был полностью заменён на оператор *. Если бы мой код показал, что подобное имеет место в выбранном мной контексте, я бы три раза подумал, стоит ли городить указатели, или написать скромный банальный бегунок, положившись на мудрость компилятора.
0
Сыроежка
Заблокирован
21.11.2011, 19:27 #74
Цитата Сообщение от CEBEP Посмотреть сообщение
Ну вот для этого то уж точно никаких экспериментов проводить не надо. написать a*(c+b) и забыть.
Проблема в том, что a * ( c + b ) - это не одно и то же, что a*c + a *b. Все зависит от значений величин. Например, в данном выражении c и b, если это вещественные числа в сумме могут давать переполнение для своего типа. Тогда, как умноженные на a, которое имеет значение меньшее единицы, переполнения выражения не будет. Именно поэтому компиляторы не могут так лихо делать подобные преобразования, да и программисты должны быть осторожны в выборе выражений.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:28 #75
Цитата Сообщение от Bers Посмотреть сообщение
Просто есть два типа людей:
1. Первые, если нужно увеличить производительность, находят самые упоротые алгоритмы, и заменяют их на более быстрые.
2. Вторые, вместо индексов массивов начинают юзать указатели, а вместо i++ писать ++i
Если у первых не получается улучшить производительность, то они начинают смотреть на дата-ориентированное программирование, и в сторону таких языков, как СИ.
У вторых ничего не получается в принципе. Потому что вся эта хрень - экономия на спичках.
Ты забыл про третий тип:
3. Ищут самые тормозные алгоритмы, заменяют их более быстрыми и при это ещё по всему тексту экономят на мелочах типа замены x++ на --x. Если не получается, то снова сравнивают алгоритмы и заменяют те, которые раньше занимали вторые места, заканчивают экономией памяти.
1
21.11.2011, 19:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 19:28
Привет! Вот еще темы с ответами:

копирование строк, производительность - C++
подскажи, как максимально быстро скопировать сроку memcpy или я написал свою функцию size_t i = 0; while (*(szReceiver + i) =...

Константы, геттеры/сеттеры и производительность - C++
Есть глобальная константа, определяющая размер большого количества массивов. Также есть множество обращений к массивам с использованием...

Производительность CPU, КЕШ, многопоточность - C++
Доброго времени суток! Суть проблемы - есть курсовой по системному программированию но я не знаю с чего и начать ( Тема:...

Вопрос про многопоточность и производительность - C++
Здравствуйте! Подскажите пожалуйста ответы на следующие вопросы: 1) Правда ли,что многопоточность в программе позволяет увеличить...


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

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

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