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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.71
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
20.11.2011, 06:34     Производительность операций #1
Не уверен в своих силах для самостоятельной оценки сабжа. Где можно найти информацию о производительности стандартных операций с++ (гуглением не справился, нашел только сравнение реализации на с++, джаве и на нескольких интерпретируемых языках)?
То есть интересует информация плана << : * как 1:15 или <= : == как 25:24... То есть, чрезвычайно интересно знать, какие операции выбирать если есть альтернатива.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
21.11.2011, 18:52     Производительность операций #61
Цитата Сообщение от LosAngeles Посмотреть сообщение
taras atavin. Вобщем всё что ты написал неверно
Вот с этим трудно не согласиться!
Я постоянно говорю, что всякие дилетанты очень агрессивны! И это всегда подтверждается!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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

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

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

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

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

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

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

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

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

Я вас уверяюю, что никто из разработчиков Windows не занимается той ерундой, которой занимаетесь вы. Если и делают оптимизацию, то на уровне компилятора, то есть на уровне генерации объектного кода. А далее пользуются этим компилятором и не засоряют себе голову вопросами умножения и сложения.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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)
), то я не скажу что быстрее: один раз на шаг обратиться по индексу, или по указателю. Но таких обращений на один шаг цикла много, то точно лучше указатель. Если же у тебя наоборот однократное обращение к элементу безо всякого цикла, то используй индекс, он в этом случае не медленнее, чем заводить явный указатель.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
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) был полностью заменён на оператор *. Если бы мой код показал, что подобное имеет место в выбранном мной контексте, я бы три раза подумал, стоит ли городить указатели, или написать скромный банальный бегунок, положившись на мудрость компилятора.
Сыроежка
Заблокирован
21.11.2011, 19:27     Производительность операций #74
Цитата Сообщение от CEBEP Посмотреть сообщение
Ну вот для этого то уж точно никаких экспериментов проводить не надо. написать a*(c+b) и забыть.
Проблема в том, что a * ( c + b ) - это не одно и то же, что a*c + a *b. Все зависит от значений величин. Например, в данном выражении c и b, если это вещественные числа в сумме могут давать переполнение для своего типа. Тогда, как умноженные на a, которое имеет значение меньшее единицы, переполнения выражения не будет. Именно поэтому компиляторы не могут так лихо делать подобные преобразования, да и программисты должны быть осторожны в выборе выражений.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:28     Производительность операций #75
Цитата Сообщение от Bers Посмотреть сообщение
Просто есть два типа людей:
1. Первые, если нужно увеличить производительность, находят самые упоротые алгоритмы, и заменяют их на более быстрые.
2. Вторые, вместо индексов массивов начинают юзать указатели, а вместо i++ писать ++i
Если у первых не получается улучшить производительность, то они начинают смотреть на дата-ориентированное программирование, и в сторону таких языков, как СИ.
У вторых ничего не получается в принципе. Потому что вся эта хрень - экономия на спичках.
Ты забыл про третий тип:
3. Ищут самые тормозные алгоритмы, заменяют их более быстрыми и при это ещё по всему тексту экономят на мелочах типа замены x++ на --x. Если не получается, то снова сравнивают алгоритмы и заменяют те, которые раньше занимали вторые места, заканчивают экономией памяти.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
21.11.2011, 19:30  [ТС]     Производительность операций #76
Цитата Сообщение от Bers Посмотреть сообщение
Вы не могли бы свои мысли как то более корректно выражать?
Извините, просто у меня ещё в голове крутится тема записи на жесткий диск. я занимался разбором файла с помощью потоков, получил немало сюрпризов и подумываю ещё и о тесте этой технологии. Там у меня, правда грубоватый, код в потоках делал 5 секунд то, что идентичный код работающий со считанным в массив char* файлом выполнил за 0.8 секунды. Если это интересно, я могу выложить завтра исходники работу которых сравнивал.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:31     Производительность операций #77
Цитата Сообщение от CEBEP Посмотреть сообщение
кладу в а время перед исполнением первого, исполняю первый, сразу после кладу время в b, потом выполняю второй, кладу время в c. теперь b - a = время выполнения первого, c - b = второго.
А время доступа ко всем этим переменным ты не учитываешь? Качественную оценку так можно получить, можно получить, что такой то оператор на столько то наносекунд быстрее. Но коэффициент?
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
21.11.2011, 19:33  [ТС]     Производительность операций #78
Цитата Сообщение от Сыроежка Посмотреть сообщение
это вещественные числа в сумме могут давать переполнение для своего типа
Это слишком далеко от контекста. Проблема была при работе в float, в double такого ещё не замечалось. Первые 5 знаков не страдают
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:33     Производительность операций #79
Цитата Сообщение от Сыроежка Посмотреть сообщение
x-a*b+a*c;
Должно быть x=a*b+a*c;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 19:47     Производительность операций
Еще ссылки по теме:

Влияет ли на производительность C++
C++ Константы, геттеры/сеттеры и производительность
C++ Производительность CPU, КЕШ, многопоточность

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

Или воспользуйтесь поиском по форуму:
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
21.11.2011, 19:47  [ТС]     Производительность операций #80
Цитата Сообщение от taras atavin Посмотреть сообщение
Но коэффициент?
да. Предпологается, что операция происходит существенно дольше чем засечка времени. Это, думаю, верно, для тестирования контейнеров. Я довольно быстро написал код, инициировавший топик, и на этапе написания помнил об этом упущении. Установить это время, уверен, не трудно. Кроме того, подобная погрешность не даст сбоя при близких значениях конкурирующих отрезков времени а просто немного их сдвинет в сторону единицы.

Добавлено через 10 минут
по поводу записи данных на восьмихардовый рейд:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <cstdio>
#include <allocators>
int main()
{
FILE* f = fopen("1.dat", "wb");
std::allocator<char> all;
char* data = all.allocate(1024 * 1024 * 1024 / sizeof(char));
fwrite(data, 1, 1024 * 1024 * 1024, f);
 
std::ofstream file("11.dat", std::ios::binary);
file.write(data, 1024 * 1024 * 1024);
file.close();
all.destroy(data);
}
Потоковый вариант работал со скоростью, соответствующей скорости спидтеста, а fwrite потел около минуты
Yandex
Объявления
21.11.2011, 19:47     Производительность операций
Ответ Создать тему
Опции темы

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