7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
||||||
1 | ||||||
Что быстрее? Обращение к элементу массива или к элементу структуры?14.07.2015, 22:54. Показов 4283. Ответов 16
Метки нет Все метки)
(
Обращение к элементу массива или к элементу структуры?
Экспериментирую с кодом и получается примерно одинаково. Что интересно, время на вызов функции do_nothing получилось примерно такое же. Оптимизация отключена. Верен ли вывод, что обращение к элементу массива, элементу структуры и вызов функции занимают одинаковое время? Использую MinGW 4.4 с Qt 4.7.4.
0
|
|
14.07.2015, 22:54 | |
Ответы с готовыми решениями:
16
Обращение к элементу структуры Обращение к элементу структуры в коллекции Обращение к элементу структуры по имени (char *)
|
Неэпический
|
||||||
14.07.2015, 23:08 | 2 | |||||
опции компилятора какие?
Вот то, что получилось из Вашего цикла при O3:
0
|
![]() ![]() |
|
14.07.2015, 23:15 | 3 |
В общем случае одинаково при условии, что обращение к элементу массива делается с константными индексами. В обоих случаях читается значение из "адрес объекта плюс константное смещение". В частном случае нужно учитывать, что для некоторых машин начинает играть роль конкретное значение смещения из-за того, что короткие литералы (константы) можно закодировать прямо в операции, а длинные константы требуют пересылки на регистр. Т.е. при сравнении нужно проверять, чтобы обращение было по одинаковому байтовому смещению
Код по проведению эксперимента, очевидно, неправильный. Да и эксперименты нужно проводить в режиме с оптимизациями, потому что в режиме без оптимизации ты будешь замерять особенности работы компилятора, а вовсе не полученный код
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
14.07.2015, 23:16 [ТС] | 4 |
0
|
![]() ![]() |
|
14.07.2015, 23:19 | 5 |
Да и сам код для замеров нужно правильно строить. При том коде, который написан, условные 70% (хз сколько в точности, может и больше) будут занимать накладные расходы по организации цикла, и только оставшиеся условные 30% - сам полезный код, который хочется замерить
Добавлено через 56 секунд Выше написано. В посте #2 показано, что будет при работе оптимизаций. В посте #3 написано, что ты вообще замеришь без оптимизаций. Как минимум этих двух пунктов достаточно
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
14.07.2015, 23:24 [ТС] | 6 |
Как организовать код, чтобы в замер попало больше времени в % от полезного кода?
0
|
![]() ![]() |
|
15.07.2015, 09:30 | 7 |
Например, внутри цикла 10 раз повторить интересующую тебя операцию. Ну а в реальной жизни никто не занимается такими вещами, как измерение скорости работы одной операции языка. Для этого всегда можно посмотреть код и почитать систему команд
Да смотри ради бога. Но понимай при этом, что ты измеряешь попугаев, а не скорость кода
0
|
Неэпический
|
|
15.07.2015, 09:46 | 8 |
Да и вызов функции понятие достаточно толстое.
С одной стороны - это просто "прыжок" в коде, но ведь к данному прыжку нужно подготовиться. Положить что куда нужно, сохранить что нужно. А назад мы придем только когда фукция завершится, а это опять "пыжок", "укладка", восстановление. Всё это накладные расходы, которые прибавятся к расходам на сам вызов (прыжок). Добавлено через 6 минут Evg, 70% на 30%? Так здесь в эти 30% еще и присваивание войдет, так что можно снижать минимум вдвое.
0
|
![]() ![]() |
|
15.07.2015, 11:43 | 9 |
Для присваивания как такового отдельной операции нет. Есть load, который одновременно читает из памяти и пишет в регистр. Т.е. он сразу же делает и присваивание. В своей оценке я исходил из того, что счётчик цикла и переменная y (которая там нафиг не нужна) располагаются на регистрах, а массив или структура - в памяти. Обращение в память - длинная операция с точки зрения процессора, а потому она имеет бОльший вес, чем какая-либо другая арифметическая операция из обслуживающего цикла. Переход назад в длинном цикле будет работать быстро (т.к. предсказатель переходов на intele очень быстро настроится)
1
|
Неэпический
|
||||||
15.07.2015, 12:10 | 10 | |||||
Evg, ну лично у меня, с -O0, вылилось в
0
|
![]() ![]() |
|
15.07.2015, 13:21 | 11 |
Потому что "y" распределился в стеке, а не на регистре. Кстати, наглядная демонстрация того, что тест меряет не то, что надо
Добавлено через 33 секунды Точнее, не тест, а его запуск в режиме без оптимизаций
1
|
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
|
|||||||||||
16.07.2015, 21:37 | 12 | ||||||||||
Обращение к массиву:
y=x[5];
y = s.c;
Из чего вроде как бы следует что обращение к структуре быстрее.
0
|
2765 / 1919 / 569
Регистрация: 05.06.2014
Сообщений: 5,576
|
|
16.07.2015, 21:46 | 13 |
Плохо генерирует. В вашем коде imul умножает четыре на пять. То есть, константу на константу. Результат такого умножения можно посчитать на стадии компиляции, а imul выкинуть за ненадобностью.
А вот если индекс элемента массива заранее неизвестен, тогда да, обращение к элементу будет медленнее обращения к элементу структуры.
0
|
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
|
|
16.07.2015, 21:53 | 14 |
Renji, у точно и правда можно выкинуть. И зачем же компилятор так делает...
0
|
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
|
|
16.07.2015, 21:59 | 16 |
А почему он генерирует именно так а не иначе, без включенных оптимизаций?
0
|
2765 / 1919 / 569
Регистрация: 05.06.2014
Сообщений: 5,576
|
|
16.07.2015, 22:42 | 17 |
Потому что считает адрес элемента по формуле адрес массива+индекс элемента*размер элемента. А упрощать эту формулу, это уже считается за оптимизацию.
0
|
16.07.2015, 22:42 | |
Помогаю со студенческими работами здесь
17
Обращение к элементу массива
Обращение к элементу массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |