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

Что быстрее? Обращение к элементу массива или к элементу структуры? - C++

Восстановить пароль Регистрация
 
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
14.07.2015, 22:54     Что быстрее? Обращение к элементу массива или к элементу структуры? #1
Обращение к элементу массива или к элементу структуры?
Экспериментирую с кодом и получается примерно одинаково. Что интересно, время на вызов функции do_nothing получилось примерно такое же. Оптимизация отключена.

Верен ли вывод, что обращение к элементу массива, элементу структуры и вызов функции занимают одинаковое время?

Использую MinGW 4.4 с Qt 4.7.4.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <ctime>
 
using namespace std;
 
struct st
{
    int a, b;
    int c;
};
 
void do_nothing() {}
 
int main()
{
    int x[10]={0};
    st s;
    s.a=5; s.b=4; s.c=12;
 
    int y=0;
 
    int t0=clock();
 
    for (int i=0; i<=100000000; i++)
    {
        //y=x[5];
        y=s.c;
        //do_nothing();
    }
 
    int t1=clock();
 
    cout << "ticks=" << t1-t0 << "\t" << endl;
 
    cout << "Hello World!" << endl;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2015, 22:54     Что быстрее? Обращение к элементу массива или к элементу структуры?
Посмотрите здесь:

подскажите организовать обращение к элементу массива в классе! C++
Обращение к элементу массива через адрес C++
Обращение к элементу массива C++
Обращение ко второму элементу массива указателей на строки C++
C++ Задача Таблица. За одно обращение к каждому элементу массива необходимо каждый элемент заменить ближайшим большим следующим за ним
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
14.07.2015, 23:08     Что быстрее? Обращение к элементу массива или к элементу структуры? #2
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Использую MinGW 4.4
опции компилятора какие?
Вот то, что получилось из Вашего цикла при O3:
Assembler
1
2
3
    call    clock
    movq    %rax, %rbp
    call    clock
Как видите, цикл просто вырезали.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
14.07.2015, 23:15     Что быстрее? Обращение к элементу массива или к элементу структуры? #3
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Обращение к элементу массива или к элементу структуры?
В общем случае одинаково при условии, что обращение к элементу массива делается с константными индексами. В обоих случаях читается значение из "адрес объекта плюс константное смещение". В частном случае нужно учитывать, что для некоторых машин начинает играть роль конкретное значение смещения из-за того, что короткие литералы (константы) можно закодировать прямо в операции, а длинные константы требуют пересылки на регистр. Т.е. при сравнении нужно проверять, чтобы обращение было по одинаковому байтовому смещению

Код по проведению эксперимента, очевидно, неправильный. Да и эксперименты нужно проводить в режиме с оптимизациями, потому что в режиме без оптимизации ты будешь замерять особенности работы компилятора, а вовсе не полученный код
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
14.07.2015, 23:16  [ТС]     Что быстрее? Обращение к элементу массива или к элементу структуры? #4
опции компилятора какие?
O0

Код по проведению эксперимента, очевидно, неправильный
Чем?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
14.07.2015, 23:19     Что быстрее? Обращение к элементу массива или к элементу структуры? #5
Да и сам код для замеров нужно правильно строить. При том коде, который написан, условные 70% (хз сколько в точности, может и больше) будут занимать накладные расходы по организации цикла, и только оставшиеся условные 30% - сам полезный код, который хочется замерить

Добавлено через 56 секунд
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Чем?
Выше написано. В посте #2 показано, что будет при работе оптимизаций. В посте #3 написано, что ты вообще замеришь без оптимизаций. Как минимум этих двух пунктов достаточно
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
14.07.2015, 23:24  [ТС]     Что быстрее? Обращение к элементу массива или к элементу структуры? #6
При том коде, который написан, условные 70% (хз сколько в точности, может и больше) будут занимать накладные расходы по организации цикла, и только оставшиеся условные 30% - сам полезный код, который хочется замерить
Большая разница будет видна.

Как организовать код, чтобы в замер попало больше времени в % от полезного кода?

В посте #3 написано, что ты вообще замеришь без оптимизаций
Мне важно посмотреть именно без оптимизаций.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
15.07.2015, 09:30     Что быстрее? Обращение к элементу массива или к элементу структуры? #7
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Как организовать код, чтобы в замер попало больше времени в % от полезного кода?
Например, внутри цикла 10 раз повторить интересующую тебя операцию. Ну а в реальной жизни никто не занимается такими вещами, как измерение скорости работы одной операции языка. Для этого всегда можно посмотреть код и почитать систему команд

Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Мне важно посмотреть именно без оптимизаций
Да смотри ради бога. Но понимай при этом, что ты измеряешь попугаев, а не скорость кода
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
15.07.2015, 09:46     Что быстрее? Обращение к элементу массива или к элементу структуры? #8
Да и вызов функции понятие достаточно толстое.
С одной стороны - это просто "прыжок" в коде, но ведь к данному прыжку нужно подготовиться. Положить что куда нужно, сохранить что нужно. А назад мы придем только когда фукция завершится, а это опять "пыжок", "укладка", восстановление. Всё это накладные расходы, которые прибавятся к расходам на сам вызов (прыжок).

Добавлено через 6 минут
Evg, 70% на 30%? Так здесь в эти 30% еще и присваивание войдет, так что можно снижать минимум вдвое.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
15.07.2015, 11:43     Что быстрее? Обращение к элементу массива или к элементу структуры? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Evg, 70% на 30%? Так здесь в эти 30% еще и присваивание войдет, так что можно снижать минимум вдвое
Для присваивания как такового отдельной операции нет. Есть load, который одновременно читает из памяти и пишет в регистр. Т.е. он сразу же делает и присваивание. В своей оценке я исходил из того, что счётчик цикла и переменная y (которая там нафиг не нужна) располагаются на регистрах, а массив или структура - в памяти. Обращение в память - длинная операция с точки зрения процессора, а потому она имеет бОльший вес, чем какая-либо другая арифметическая операция из обслуживающего цикла. Переход назад в длинном цикле будет работать быстро (т.к. предсказатель переходов на intele очень быстро настроится)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
15.07.2015, 12:10     Что быстрее? Обращение к элементу массива или к элементу структуры? #10
Evg, ну лично у меня, с -O0, вылилось в
Assembler
1
2
    movl    -44(%ebp), %eax
    movl    %eax, -32(%ebp)
По сути, нас интересует только первая операция, вторая - это уже пихание результата в y
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
15.07.2015, 13:21     Что быстрее? Обращение к элементу массива или к элементу структуры? #11
Цитата Сообщение от Croessmah Посмотреть сообщение
Evg, ну лично у меня, с -O0, вылилось в
Потому что "y" распределился в стеке, а не на регистре. Кстати, наглядная демонстрация того, что тест меряет не то, что надо

Добавлено через 33 секунды
Точнее, не тест, а его запуск в режиме без оптимизаций
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
16.07.2015, 21:37     Что быстрее? Обращение к элементу массива или к элементу структуры? #12
Обращение к массиву:
y=x[5];
Assembler
1
2
3
4
    mov eax, 4
    imul    ecx, eax, 5
    mov edx, DWORD PTR _x$[ebp+ecx]
    mov DWORD PTR _y$[ebp], edx
Обращение к структуре:
y = s.c;
Assembler
1
2
    mov eax, DWORD PTR _s$[ebp+8]
    mov DWORD PTR _y$[ebp], eax
Вот так генерирует VS2013.
Из чего вроде как бы следует что обращение к структуре быстрее.
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,951
16.07.2015, 21:46     Что быстрее? Обращение к элементу массива или к элементу структуры? #13
Цитата Сообщение от VD Посмотреть сообщение
Вот так генерирует VS2013.
Плохо генерирует. В вашем коде imul умножает четыре на пять. То есть, константу на константу. Результат такого умножения можно посчитать на стадии компиляции, а imul выкинуть за ненадобностью.
А вот если индекс элемента массива заранее неизвестен, тогда да, обращение к элементу будет медленнее обращения к элементу структуры.
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
16.07.2015, 21:53     Что быстрее? Обращение к элементу массива или к элементу структуры? #14
Renji, у точно и правда можно выкинуть. И зачем же компилятор так делает...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
16.07.2015, 21:54     Что быстрее? Обращение к элементу массива или к элементу структуры? #15
Цитата Сообщение от VD Посмотреть сообщение
И зачем же компилятор так делает
Потому что оптимизации не включены
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
16.07.2015, 21:59     Что быстрее? Обращение к элементу массива или к элементу структуры? #16
А почему он генерирует именно так а не иначе, без включенных оптимизаций?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2015, 22:42     Что быстрее? Обращение к элементу массива или к элементу структуры?
Еще ссылки по теме:

C++ обращение к элементу динамического массива структуры
Map iterator обращение к предыдущему или последующему элементу C++
C++ Обращение к элементу массива из строк

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

Или воспользуйтесь поиском по форуму:
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,951
16.07.2015, 22:42     Что быстрее? Обращение к элементу массива или к элементу структуры? #17
Цитата Сообщение от VD Посмотреть сообщение
А почему он генерирует именно так а не иначе, без включенных оптимизаций?
Потому что считает адрес элемента по формуле адрес массива+индекс элемента*размер элемента. А упрощать эту формулу, это уже считается за оптимизацию.
Yandex
Объявления
16.07.2015, 22:42     Что быстрее? Обращение к элементу массива или к элементу структуры?
Ответ Создать тему
Опции темы

Текущее время: 08:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru