Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
#1

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

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

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

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

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

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

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

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

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

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

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

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

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

16
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
10.04.2016, 08:30 #2
Что меня удивило - порядок цифр - ЧЕМ вы меряете нс? На вин я мерил ну никак не точнее мкс
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
10.04.2016, 10:15  [ТС] #3
вчера я нашел сам ответ на свой вопрос и достаточно корректно замерил.
для времени использую gettimeofday
речь идет о десятке - паре десятков нано сек.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
10.04.2016, 10:46 #4
Если речь о таких промежутках замер на единичном вызове не имеет смысла так как не хватит разрешающей способности
0
VTsaregorodtsev
519 / 447 / 67
Регистрация: 19.02.2010
Сообщений: 1,718
10.04.2016, 21:35 #5
Цитата Сообщение от karat39 Посмотреть сообщение
Работаю над ускорением кода для работы со строками.
-memcpy
Ради интереса гляньте на старую презенташку https://kldp.org/files/gdc_2002_amd.pdf - там видно, что скорость реализаций memcpy может отличаться в разы. Но! Только при условии заточки под вполне определённые особенности данных (размеры блоков памяти, неиспользование массива-реципиента сразу же после копирования, или что ещё).
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
11.04.2016, 10:23  [ТС] #6
Ради интереса гляньте на старую презенташку https://kldp.org/files/gdc_2002_amd.pdf - там видно, что скорость реализаций memcpy может отличаться в разы. Но! Только при условии заточки под вполне определённые особенности данных (размеры блоков памяти, неиспользование массива-реципиента сразу же после копирования, или что ещё).
спасибо учту. На каждый блок памяти именно ее и проверяю. Пока она существенный прирост дает. Мои ассемблерные вставки уступают.

Добавлено через 11 часов 50 минут
Кстати исходя из своего опыта ассемблера, я понял, почему memcpy дает очень разные результаты на разных кусках памяти.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
11.04.2016, 11:41 #7
Цитата Сообщение от karat39 Посмотреть сообщение
Кстати исходя из своего опыта ассемблера, я понял, почему memcpy дает очень разные результаты на разных кусках памяти.
разжуйте же нам эту тайну не держите в себе
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
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. КАк то так мое мнение, я его чуть позже проверю окончательно.
1
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
12.04.2016, 13:24 #9
Цитата Сообщение от karat39 Посмотреть сообщение
Я был удивлен, что memcpy обгоняет мой код ассембелера. И после экспериментов понял почему.
Открою тебе маленький секрет: компиляторы пишут весьма неглупые люди. И они отлично представляют себе, что функции типа memcpy будут вызываться не просто часто, а оочень! часто. И поэтому оптимизируют их по самые.... короче, по эти самые
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
12.04.2016, 13:31  [ТС] #10
Честно говоря, я думаю, что я ее обгоню в нестандартной ситуации. Я еще не до конца дотестил.
Например если мне надо будет перегнать 32 байта, думаю, что быстрее будет сделать на ассм 4 по 8 байт, чем memcpy сделает 10 + 10 +10 + 2. Но мне это еще предстоит изучить.
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
12.04.2016, 16:09 #11
Да, обгонишь. Вне всякого сомнения. На твоей машине (с твоим CPU и твоими кэшами). А что будет при переносе на соседнюю машину - с другим CPU, кэшами и так далее? А на третью, двадцатую...?
1
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
12.04.2016, 16:27  [ТС] #12
Замечание верное. Но я/мы затачиваем под конкретную задачу на конкретном сервере на конкретной ОС.
0
VTsaregorodtsev
519 / 447 / 67
Регистрация: 19.02.2010
Сообщений: 1,718
18.04.2016, 12:34 #13
karat39, кстати, ещё вариант поглядеть - библиотечка от Агнера Фога, брать на agner.org
Там memcpy и strcpy есть - может, в их исходниках найдётся что-то интересное.
Заодно там же на сайте лежат справочники по растактовке процессорных команд у разных процессоров и мануалы по оптимизации программ на ассемблере и С.
Ну и у Интела взять тамошний Intel 64 and IA-32 Architectures Optimization Reference Manual.
1
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
19.04.2016, 08:55  [ТС] #14
VTsaregorodtsev, спасибо, заинтересовала растактовка.
Кстати по прежнему уверен, что при умелом подходе, все таки надо ассм вставлять. Хотя memcpy крайне сложно обогнать. Чуть позже дизассемблирую ее и гляну что там.

Добавлено через 8 минут
VTsaregorodtsev, спасибо огромное за сайт.
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
12.05.2016, 22:40  [ТС] #15
Если кому будет интересно. boost классно замеряет скорость. Можно спуститься до наносекунд.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
13.05.2016, 08:23 #16
karat39, слайды слайды! Если честно про нано - не верю
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
13.05.2016, 11:15  [ТС] #17
чуть позже (на выходных) я расскажу весь свой полученный опыт.
0
13.05.2016, 11:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2016, 11:15

Проверка скорости работы своего list
Можете написать какую нибудь проверку скорости работы list (без algorithm)....

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

Framework / Workflow - обмен опытом
Чем больше я работаю, тем лучше я понимаю, что нужно бизнесу, какие задачи...


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

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

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