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

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

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

Студворк — интернет-сервис помощи студентам
Не уверен в своих силах для самостоятельной оценки сабжа. Где можно найти информацию о производительности стандартных операций с++ (гуглением не справился, нашел только сравнение реализации на с++, джаве и на нескольких интерпретируемых языках)?
То есть интересует информация плана << : * как 1:15 или <= : == как 25:24... То есть, чрезвычайно интересно знать, какие операции выбирать если есть альтернатива.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
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  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от LosAngeles Посмотреть сообщение
результат rdtsc помещается в пару edx:eax на ia32, а на intel64
кстати да,ведь у меня 32х-разрядное приложение сейчас запускается...
0
Заблокирован
21.11.2011, 18:28
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
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
21.11.2011, 18:29
Много всего неразумного
[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
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Скорость работы с вектором. Не считаю я что получать указатель на первый элемент и работать с ним это правильно.
У вас там добавление в конец:

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

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

Можно тайпдефом замаскировать под итератор для особо привередливых
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
21.11.2011, 18:30
Цитата Сообщение от Bers Посмотреть сообщение
Что касается указателя вместо итератора - для критичного к скорости места вполне себе приемлемо.
Некрасиво же
У вас там добавление в конец:
Надо reserve добавить.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:30
Кстати, CEBEP, как ты вообще измеряешь время исполнения отдельных операторов? Ведь без точного времени исполнения непосредственно сравниваемых операторов нельзя получить коэффициенты.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.11.2011, 18:31
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
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Есть реаллок. Ну если одним куском памяти примерно одинаковая скорость будет.
но если примерно одинаковая скорость будит, значит вектор работает примерно одинакова
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
21.11.2011, 18:35  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
од C++
x*=2;
медленнее, чем
x+=x;
а если отчебучить что-нибудь типа x = x << 1? Я к тому, что просто список что быстрее а что нет и так ясен - я расставил операции в эксперименте так, что всегда отношение или больше или близко к 1 с первого раза. Хочется знать именно отношение

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

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

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


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

У вторых ничего не получается в принципе. Потому что вся эта хрень - экономия на спичках.
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
21.11.2011, 18:38  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
время исполнения отдельных операторов?
кладу в а время перед исполнением первого, исполняю первый, сразу после кладу время в b, потом выполняю второй, кладу время в c. теперь b - a = время выполнения первого, c - b = второго.
0
Заблокирован
21.11.2011, 18:39
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
экономия на спичках
первый пункт неиллюзорно сложен а книжки по математическим методам в нашей теме уже прочитаны. выдумывать своё - чуть менее чем защитить кандидатскую.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:44
Цитата Сообщение от 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
Цитата Сообщение от taras atavin Посмотреть сообщение
Этим ты показал свой непрофессионализм. Вопрос как раз актуален при ручной оптимизации, сомнителен же только подход.
Я вам советую сначала почитать Герба Саттера "Решение сложных задач на С++", где он как раз говорит про оптимизацию и проходится по таким "профессионалам", как вы, которые занимаются "ручной оптимизацией". Я могу вам на ушко сказать, где "ручная оптимизация" может вам пригодиться!
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:48
Цитата Сообщение от ForEveR Посмотреть сообщение
Точно не имеющих?
Ну ка найди в бусте решение для системы 1000*1000. Так вот, это ещё малыш. Я решал 17000*17000.
1
Заблокирован
21.11.2011, 18:48
Цитата Сообщение от CEBEP Посмотреть сообщение
первый пункт неиллюзорно сложен
Не нужно изобретать новые паттерны-алгоритмы.

Нужно просто поменять кусок упоротой архитектуры на другой, более быстрый.
Смотришь, какой кусок программы выполняется дольше всех. и думаешь, как его можно оптимизировать. Например, скорость теряется из-за многочисленных левых расчетов - можно на таком участке закэшировать часть данных.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2011, 18:50
Цитата Сообщение от Сыроежка Посмотреть сообщение
Однако в современных микропроцессоров есть векторные модули, которые делают операции умножения очень быстрыми, что не имеет никакого смысла заменять их серией сложений.
Серией? Или заменять удвоение одним сложением? А если выбор между
C++
1
x-a*b+a*c;
и
C++
1
x=a*(b+c);
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2011, 18:50
Помогаю со студенческими работами здесь

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

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

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

Доказать равенства, используя свойства операций над множествами и определения операций
Доказать равенства, используя свойства операций над множествами и определения операций. б) Ax(B\C)=(AxB)\(AxC). Почему график не...

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru