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

C++

Войти
Регистрация
Восстановить пароль
 
 
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
#1

Проверка скорости кода. Обмен опытом - C++

09.04.2016, 16:14. Просмотров 502. Ответов 16
Метки нет (Все метки)

Вводные данные:
- C++ стандарта 11
- gcc

Работаю над ускорением кода для работы со строками. К примеру, сравниваю между собой скорость работы:
-strncpy
-strcpy
-через ассемблер movs
-memcpy

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

С чего начал. Начала с простого. Запуск функций на готовых переменных типа char[10]. Чем больше итераций, тем быстрее работает функция (кроме ассемблерной вставки). Понятно что компилятор оптимизирует код. К пример единичный запуск показывает время работы 3000 нано сек, второй запуск уже 1500 нано сек. Опции компилятора -O не помогает.

Чем продолжил. Генерирую массив на N строк. Забиваю его random символами. Запускаю. По прежнему ассемблерная вставка показывает постоянный результат, все остальные функции от кол-во итераций ускоряются, но уже меньше. Стали влиять так же опции компилятора -O.

Вопрос. Как вычислить истинное значение времени работы функции? Поделитесь опытом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2016, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка скорости кода. Обмен опытом (C++):

Обмен опытом и сотрудничество - C++
Здравствуйте, программисты, веб-мастера, дизайнеры. Рад буду пообщаться, обменяться опытом, и принять участие в совместных проектах. ...

Проверка правильности выполнения кода, введённого в Memo - C++ Builder
Здравствуйте. Мне нужно создать приложение для обучения программированию на C++. Проблема такая: есть теория, есть исходный код,...

Обмен опытом по программированию на С++ - C++
А никто не знает сайты, направленные на обмен опытом между программистами, как здесь: ...

Обмен опытом или как бы это сделали бы Вы!! - C++
Здравствуйте уважаемые форумчане! Дана задача: Создайте класс ,напишите метод для преобразования числа типа long double денежную...

Обмен данными по COM порту на нестандартной скорости - C++
подскажите пожалуйста, как написать программу для обмена данными по COM порту на не стандартной скорости, например 10400бод.

Проверка скорости работы своего list - C++
Можете написать какую нибудь проверку скорости работы list (без algorithm). Создал свой вариант, вроде работает и быстро, и не могли бы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3158 / 1960 / 219
Регистрация: 13.01.2012
Сообщений: 7,501
10.04.2016, 08:30 #2
Что меня удивило - порядок цифр - ЧЕМ вы меряете нс? На вин я мерил ну никак не точнее мкс
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
10.04.2016, 10:15  [ТС] #3
вчера я нашел сам ответ на свой вопрос и достаточно корректно замерил.
для времени использую gettimeofday
речь идет о десятке - паре десятков нано сек.
vxg
Модератор
3158 / 1960 / 219
Регистрация: 13.01.2012
Сообщений: 7,501
10.04.2016, 10:46 #4
Если речь о таких промежутках замер на единичном вызове не имеет смысла так как не хватит разрешающей способности
VTsaregorodtsev
346 / 326 / 48
Регистрация: 19.02.2010
Сообщений: 1,388
10.04.2016, 21:35 #5
Цитата Сообщение от karat39 Посмотреть сообщение
Работаю над ускорением кода для работы со строками.
-memcpy
Ради интереса гляньте на старую презенташку https://kldp.org/files/gdc_2002_amd.pdf - там видно, что скорость реализаций memcpy может отличаться в разы. Но! Только при условии заточки под вполне определённые особенности данных (размеры блоков памяти, неиспользование массива-реципиента сразу же после копирования, или что ещё).
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
11.04.2016, 10:23  [ТС] #6
Ради интереса гляньте на старую презенташку https://kldp.org/files/gdc_2002_amd.pdf - там видно, что скорость реализаций memcpy может отличаться в разы. Но! Только при условии заточки под вполне определённые особенности данных (размеры блоков памяти, неиспользование массива-реципиента сразу же после копирования, или что ещё).
спасибо учту. На каждый блок памяти именно ее и проверяю. Пока она существенный прирост дает. Мои ассемблерные вставки уступают.

Добавлено через 11 часов 50 минут
Кстати исходя из своего опыта ассемблера, я понял, почему memcpy дает очень разные результаты на разных кусках памяти.
vxg
Модератор
3158 / 1960 / 219
Регистрация: 13.01.2012
Сообщений: 7,501
11.04.2016, 11:41 #7
Цитата Сообщение от karat39 Посмотреть сообщение
Кстати исходя из своего опыта ассемблера, я понял, почему memcpy дает очень разные результаты на разных кусках памяти.
разжуйте же нам эту тайну не держите в себе
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
11.04.2016, 12:02  [ТС] #8
Извините, у меня на форуме не получается комментировать в ответе чужое сообщение.

Мое мнение такое. Я его частично проверил, частично не успел. Я был удивлен, что memcpy обгоняет мой код ассембелера. И после экспериментов понял почему. Для процессора, типы данных делятся на:
1,2,4,8,10 байт. memcpy скорее всего перекидывает из памяти в память по большему значению (например 10 байт) и потом остаток побайтно (или по 2 байта или 4 байта, в зависимости от остатка). Кстати на ассм я делал по 4 байта, поэтому проиграл.
Получается, если тип данных хорошо кратен данным цифрам, то кол-во операций процессора (особенно связанные с записью в регистр) минимально. Например если мы будем перекидывать строки длиной 10 байт, memcpy тут просто будет идеален, а если 13, то уже будет работать медленней. Я его не диззасемблировал еще, но скорее всего он перекинет 10 + 2 + 1. Это как минимум еще 2 обращения к регистру ecx. КАк то так мое мнение, я его чуть позже проверю окончательно.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
12.04.2016, 13:24 #9
Цитата Сообщение от karat39 Посмотреть сообщение
Я был удивлен, что memcpy обгоняет мой код ассембелера. И после экспериментов понял почему.
Открою тебе маленький секрет: компиляторы пишут весьма неглупые люди. И они отлично представляют себе, что функции типа memcpy будут вызываться не просто часто, а оочень! часто. И поэтому оптимизируют их по самые.... короче, по эти самые
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
12.04.2016, 13:31  [ТС] #10
Честно говоря, я думаю, что я ее обгоню в нестандартной ситуации. Я еще не до конца дотестил.
Например если мне надо будет перегнать 32 байта, думаю, что быстрее будет сделать на ассм 4 по 8 байт, чем memcpy сделает 10 + 10 +10 + 2. Но мне это еще предстоит изучить.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
12.04.2016, 16:09 #11
Да, обгонишь. Вне всякого сомнения. На твоей машине (с твоим CPU и твоими кэшами). А что будет при переносе на соседнюю машину - с другим CPU, кэшами и так далее? А на третью, двадцатую...?
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
12.04.2016, 16:27  [ТС] #12
Замечание верное. Но я/мы затачиваем под конкретную задачу на конкретном сервере на конкретной ОС.
VTsaregorodtsev
346 / 326 / 48
Регистрация: 19.02.2010
Сообщений: 1,388
18.04.2016, 12:34 #13
karat39, кстати, ещё вариант поглядеть - библиотечка от Агнера Фога, брать на agner.org
Там memcpy и strcpy есть - может, в их исходниках найдётся что-то интересное.
Заодно там же на сайте лежат справочники по растактовке процессорных команд у разных процессоров и мануалы по оптимизации программ на ассемблере и С.
Ну и у Интела взять тамошний Intel 64 and IA-32 Architectures Optimization Reference Manual.
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
19.04.2016, 08:55  [ТС] #14
VTsaregorodtsev, спасибо, заинтересовала растактовка.
Кстати по прежнему уверен, что при умелом подходе, все таки надо ассм вставлять. Хотя memcpy крайне сложно обогнать. Чуть позже дизассемблирую ее и гляну что там.

Добавлено через 8 минут
VTsaregorodtsev, спасибо огромное за сайт.
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
12.05.2016, 22:40  [ТС] #15
Если кому будет интересно. boost классно замеряет скорость. Можно спуститься до наносекунд.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2016, 22:40
Привет! Вот еще темы с ответами:

Обмен опытом об iptables - Ubuntu Linux
Поделитесь своим опытом создания правил iptables. Например в каком порядке создавать правила и т д

Обмен опытом: свойство Enabled - Visual Basic .NET
Приветствую. Хотел бы обменяться опытом. Так вот. Представьте себе стандартную форму с большим количеством полей и тулбаром. Понятно,...

Работа с датчиком давления BME280. Обсуждение, обмен опытом - КИП, датчики
Доброго времени суток заглянувшему сюда. Сказать, что датчик "сложный".. Думаю нет. Скорее несколько неординарный, имеющий специфические...

Проверка скорости чтения - Delphi
Народ кому не сложно кто может замутить аналог))) хотя бы 1 пример


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.05.2016, 22:40
Ответ Создать тему
Опции темы

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