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

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

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

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

20.11.2011, 06:34. Просмотров 7829. Ответов 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
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
21.11.2011, 19:30  [ТС] #76
Цитата Сообщение от Bers Посмотреть сообщение
Вы не могли бы свои мысли как то более корректно выражать?
Извините, просто у меня ещё в голове крутится тема записи на жесткий диск. я занимался разбором файла с помощью потоков, получил немало сюрпризов и подумываю ещё и о тесте этой технологии. Там у меня, правда грубоватый, код в потоках делал 5 секунд то, что идентичный код работающий со считанным в массив char* файлом выполнил за 0.8 секунды. Если это интересно, я могу выложить завтра исходники работу которых сравнивал.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:31 #77
Цитата Сообщение от CEBEP Посмотреть сообщение
кладу в а время перед исполнением первого, исполняю первый, сразу после кладу время в b, потом выполняю второй, кладу время в c. теперь b - a = время выполнения первого, c - b = второго.
А время доступа ко всем этим переменным ты не учитываешь? Качественную оценку так можно получить, можно получить, что такой то оператор на столько то наносекунд быстрее. Но коэффициент?
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
21.11.2011, 19:33  [ТС] #78
Цитата Сообщение от Сыроежка Посмотреть сообщение
это вещественные числа в сумме могут давать переполнение для своего типа
Это слишком далеко от контекста. Проблема была при работе в float, в double такого ещё не замечалось. Первые 5 знаков не страдают
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 19:33 #79
Цитата Сообщение от Сыроежка Посмотреть сообщение
x-a*b+a*c;
Должно быть x=a*b+a*c;
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
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 потел около минуты
0
prazuber
110 / 110 / 3
Регистрация: 29.04.2010
Сообщений: 240
21.11.2011, 19:57 #81
Предлагаю ТСу забить на такого рода оптимизацию. Все равно в итоге выигрыш будет незначительным.

Если необходимо ускорить код, то надо переходить на чистый С. Надо считать массив из файла, где заранее кол-во элементов неизвестно? realloc в помощь. Если известно приблизительное количество элементов, можно еще ускорить процесс.

Необходимо решать большие СЛАУ? Может вы просто метод не тот выбрали?
0
Bers
Заблокирован
21.11.2011, 20:09 #82
Извиняюсь за сумбур. Ибо я ассемблер не ведаю. И возможно просто не понимаю о чем сейчас напишу.

Мне вот интересно, а вот так можно сделать:

Если допустим, операция + (причем в ассемблированном варианте, а не на языке с++) весит.. нууу пусть будит 1 условная единица.

Допустим * - 2 условных единицы

А разделить - 3 условных единицы, ну и тд


После компиляции, просматривается кусок кода (функции, которую нужно замерить), и тупо подсчитывается, сколько условных единиц она наберёт.

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

Конечно, нужно как то учесть поправку на то, что разные коды могут выполняться одновременно на разных ядрышках. Но! В целом, даже не зная, сколько времени будит исполняться код, можно же замерить его "условную тяжесть". И сравнивать разные куски кода друг с другом. Ведь все равно, тот кусок, который наберёт больше условных единиц будит работать медленнее более легковесных аналогов.

Как вам идея?

Все что нужно - на одно-ядерном компьютере при 100% загрузке процессора (а ещё лучше не на многозадачной ОС) погонять ассемблированные команды, и определить их адекватные условные веса.

Можно вообще весь ассемблер "оценить". И потом получать в условных единицах абсолютную оценку производительности функций, алгоритмов и тп
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
22.11.2011, 01:45  [ТС] #83
Цитата Сообщение от Bers Посмотреть сообщение
замерить его "условную тяжесть"
Суммирование (add), по весу ровно столько же, сколько и перемножение (mul), если, конечно, реализация выберет mul а не что-то из перебранного выше.
0
fasked
22.11.2011, 02:40
  #84

Не по теме:

Пишите на ассемблере, вот где для оптимизаций непочатый край. А Си и С++ оставьте для продакшн кода

1
LosAngeles
Заблокирован
22.11.2011, 04:56 #85
Цитата Сообщение от Bers Посмотреть сообщение
Конечно, нужно как то учесть поправку на то, что разные коды могут выполняться одновременно на разных ядрышках. Но! В целом, даже не зная, сколько времени будит исполняться код, можно же замерить его "условную тяжесть". И сравнивать разные куски кода друг с другом. Ведь все равно, тот кусок, который наберёт больше условных единиц будит работать медленнее более легковесных аналогов.
Как вам идея?
мерять то в любом случае пока нечего. Все вышеприведённые "оптимизации" тарасика ассемблируются совершенно одинаково, код до оптимизации эквивалентен коду после. Все они высосаны из пальца и существуют только в его голове)
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 05:23 #86
C++
1
x=a*b+a*c;
- плохрой пример, так как со скобками будет на одну операцию меньше. Но идея, надеюсь, понятна?
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
22.11.2011, 05:33  [ТС] #87
Цитата Сообщение от LosAngeles Посмотреть сообщение
Все они высосаны из пальца и существуют только в его голове)
да блин! почему тогда результаты сравнения далеки от 1? Вы выбрали какое-то одно сравнение, которое я добавил по причинам, далёким от насущной необходимости и решили что всё не имеет смысла. Приведите мне достоверное рассуждение, показывающее, что, скажем, обращение к элементу вектора - тот же самый асэмблеровский код, что и обращение к элементу массива! Это, в конце концов, глупо - утверждать то, что не соответствует эксперименту. Я в самом начале просил, чтобы если вы хотите сказать "нет разницы", то скажите мне как настроить мой тест, чтобы он подтвердил ваши слова! А иначе - вон из моего топа, я не интересуюсь вашим мнением.

Добавлено через 5 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Но идея, надеюсь, понятна?
зачем вообще мусолить этот пример? То, как он работает очевидно. лучше бы разобрали то, как работает разыменование итераторов. 10 минут чтения книги Герба Статтера (смотри выше) дали мне больше чем весь этот флуд на 9 страниц
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2011, 05:35 #88
Цитата Сообщение от LosAngeles Посмотреть сообщение
мерять то в любом случае пока нечего. Все вышеприведённые "оптимизации" тарасика ассемблируются совершенно одинаково, код до оптимизации эквивалентен коду после. Все они высосаны из пальца и существуют только в его голове)
Я не придумал сам ни одной из этих оптимизаций, все взяты из книг. Хороший компилятор оптимизирует x++ до ++x? Эйси. Но всегда ли гарантируется такая оптимизация? ТС продемонстрировал, что это не так. И даже при такой оптимизации ++x грантированно не медленее, чем x++, это же оносится и к случаю, когда автоматическая оптимизация не выполняется вовсе и ко всем возможным промежуточным вариантам. А x++ может быть медленее ++x. И причина как раз в создании и уничтожении временного объекта. На чистых сях этой разницы нет, так как там это синтаксичесик различные формы одного оператора. А теперь теория: все сравнения в заголовке с нолём выполняются не по cmp, а по jnz/jz, а эти команды не требуют загрузки лишнего чилсового операнда, в отличие от cmp. Адрес же грузится в любом случае одинаково, так как любые сравнения в заголовке цикла выполняются с целью перехода. То есть
Assembler
1
2
DEC AX;
JNZ loop1;
быстрее, чем
Assembler
1
2
3
INC AX;
CMP lim;
JLE loop1;
, так как в первом случае грузится только два кода операции и адрес перехода, а во втором три кода операции, предел сравнения и адрес перехода. Сам я придумал только алгоритмические оптимизации и сжатие данных, но ни одной замены операции с целью оптимизации.
1
LosAngeles
Заблокирован
22.11.2011, 05:37 #89
taras atavin, с какими скобками? Если такими a*(b+c) то нет, не меньше. Кончай уже фантазировать, тему всё-таки дети читают, а то вдруг и правда кто-то поверит в твои спичечные оптимизации. Всё что ты писал до этого, ниодна твоя оптимизация не существует в природе!
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
22.11.2011, 05:45  [ТС] #90
LosAngeles, вы голословны. покажите всё-таки, как убедится в ваших словах
0
22.11.2011, 05:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 05:45
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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