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

C++

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

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

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

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

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

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

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

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

Вопрос. Как вычислить истинное значение времени работы функции? Поделитесь опытом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3115 / 1917 / 207
Регистрация: 13.01.2012
Сообщений: 7,331
10.04.2016, 08:30     Проверка скорости кода. Обмен опытом #2
Что меня удивило - порядок цифр - ЧЕМ вы меряете нс? На вин я мерил ну никак не точнее мкс
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
10.04.2016, 10:15  [ТС]     Проверка скорости кода. Обмен опытом #3
вчера я нашел сам ответ на свой вопрос и достаточно корректно замерил.
для времени использую gettimeofday
речь идет о десятке - паре десятков нано сек.
vxg
Модератор
3115 / 1917 / 207
Регистрация: 13.01.2012
Сообщений: 7,331
10.04.2016, 10:46     Проверка скорости кода. Обмен опытом #4
Если речь о таких промежутках замер на единичном вызове не имеет смысла так как не хватит разрешающей способности
VTsaregorodtsev
327 / 307 / 45
Регистрация: 19.02.2010
Сообщений: 1,313
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
Модератор
3115 / 1917 / 207
Регистрация: 13.01.2012
Сообщений: 7,331
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,353
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,353
12.04.2016, 16:09     Проверка скорости кода. Обмен опытом #11
Да, обгонишь. Вне всякого сомнения. На твоей машине (с твоим CPU и твоими кэшами). А что будет при переносе на соседнюю машину - с другим CPU, кэшами и так далее? А на третью, двадцатую...?
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
12.04.2016, 16:27  [ТС]     Проверка скорости кода. Обмен опытом #12
Замечание верное. Но я/мы затачиваем под конкретную задачу на конкретном сервере на конкретной ОС.
VTsaregorodtsev
327 / 307 / 45
Регистрация: 19.02.2010
Сообщений: 1,313
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 классно замеряет скорость. Можно спуститься до наносекунд.
vxg
Модератор
3115 / 1917 / 207
Регистрация: 13.01.2012
Сообщений: 7,331
13.05.2016, 08:23     Проверка скорости кода. Обмен опытом #16
karat39, слайды слайды! Если честно про нано - не верю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2016, 11:15     Проверка скорости кода. Обмен опытом
Еще ссылки по теме:
C++ проверка кода на правильность
C++ Проверка кода программы
Экстремумы проверка кода C++
проверка кода, функции C++

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

Или воспользуйтесь поиском по форуму:
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 74
13.05.2016, 11:15  [ТС]     Проверка скорости кода. Обмен опытом #17
чуть позже (на выходных) я расскажу весь свой полученный опыт.
Yandex
Объявления
13.05.2016, 11:15     Проверка скорости кода. Обмен опытом
Ответ Создать тему
Опции темы

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