Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99

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

14.07.2015, 22:54. Показов 5683. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обращение к элементу массива или к элементу структуры?
Экспериментирую с кодом и получается примерно одинаково. Что интересно, время на вызов функции 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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.07.2015, 22:54
Ответы с готовыми решениями:

Обращение к элементу структуры
В strncpy и printf нужно прописать путь к элементам структуры через указатели(-&gt;). Можете помочь пожалуйста, а то что-то тут у меня н...

Обращение к элементу структуры в коллекции
Здравствуйте, объясните пожалуйста каким образом я могу обратиться к элементу структуры находящемуся в коллекции? Допустим мне нужно...

Обращение к элементу структуры по имени (char *)
Здравствуйте. Пишу на чистом Си, потребовалось использование конфигурационного файла, решил сделать файл следующей структуры: ...

16
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
14.07.2015, 23:08
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Использую MinGW 4.4
опции компилятора какие?
Вот то, что получилось из Вашего цикла при O3:
Assembler
1
2
3
    call    clock
    movq    %rax, %rbp
    call    clock
Как видите, цикл просто вырезали.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.07.2015, 23:15
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Обращение к элементу массива или к элементу структуры?
В общем случае одинаково при условии, что обращение к элементу массива делается с константными индексами. В обоих случаях читается значение из "адрес объекта плюс константное смещение". В частном случае нужно учитывать, что для некоторых машин начинает играть роль конкретное значение смещения из-за того, что короткие литералы (константы) можно закодировать прямо в операции, а длинные константы требуют пересылки на регистр. Т.е. при сравнении нужно проверять, чтобы обращение было по одинаковому байтовому смещению

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

Код по проведению эксперимента, очевидно, неправильный
Чем?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.07.2015, 23:19
Да и сам код для замеров нужно правильно строить. При том коде, который написан, условные 70% (хз сколько в точности, может и больше) будут занимать накладные расходы по организации цикла, и только оставшиеся условные 30% - сам полезный код, который хочется замерить

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

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

В посте #3 написано, что ты вообще замеришь без оптимизаций
Мне важно посмотреть именно без оптимизаций.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.07.2015, 09:30
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Как организовать код, чтобы в замер попало больше времени в % от полезного кода?
Например, внутри цикла 10 раз повторить интересующую тебя операцию. Ну а в реальной жизни никто не занимается такими вещами, как измерение скорости работы одной операции языка. Для этого всегда можно посмотреть код и почитать систему команд

Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Мне важно посмотреть именно без оптимизаций
Да смотри ради бога. Но понимай при этом, что ты измеряешь попугаев, а не скорость кода
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
15.07.2015, 09:46
Да и вызов функции понятие достаточно толстое.
С одной стороны - это просто "прыжок" в коде, но ведь к данному прыжку нужно подготовиться. Положить что куда нужно, сохранить что нужно. А назад мы придем только когда фукция завершится, а это опять "пыжок", "укладка", восстановление. Всё это накладные расходы, которые прибавятся к расходам на сам вызов (прыжок).

Добавлено через 6 минут
Evg, 70% на 30%? Так здесь в эти 30% еще и присваивание войдет, так что можно снижать минимум вдвое.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.07.2015, 11:43
Цитата Сообщение от Croessmah Посмотреть сообщение
Evg, 70% на 30%? Так здесь в эти 30% еще и присваивание войдет, так что можно снижать минимум вдвое
Для присваивания как такового отдельной операции нет. Есть load, который одновременно читает из памяти и пишет в регистр. Т.е. он сразу же делает и присваивание. В своей оценке я исходил из того, что счётчик цикла и переменная y (которая там нафиг не нужна) располагаются на регистрах, а массив или структура - в памяти. Обращение в память - длинная операция с точки зрения процессора, а потому она имеет бОльший вес, чем какая-либо другая арифметическая операция из обслуживающего цикла. Переход назад в длинном цикле будет работать быстро (т.к. предсказатель переходов на intele очень быстро настроится)
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
15.07.2015, 12:10
Evg, ну лично у меня, с -O0, вылилось в
Assembler
1
2
    movl    -44(%ebp), %eax
    movl    %eax, -32(%ebp)
По сути, нас интересует только первая операция, вторая - это уже пихание результата в y
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.07.2015, 13:21
Цитата Сообщение от Croessmah Посмотреть сообщение
Evg, ну лично у меня, с -O0, вылилось в
Потому что "y" распределился в стеке, а не на регистре. Кстати, наглядная демонстрация того, что тест меряет не то, что надо

Добавлено через 33 секунды
Точнее, не тест, а его запуск в режиме без оптимизаций
1
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
16.07.2015, 21:37
Обращение к массиву:
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.
Из чего вроде как бы следует что обращение к структуре быстрее.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.07.2015, 21:46
Цитата Сообщение от VD Посмотреть сообщение
Вот так генерирует VS2013.
Плохо генерирует. В вашем коде imul умножает четыре на пять. То есть, константу на константу. Результат такого умножения можно посчитать на стадии компиляции, а imul выкинуть за ненадобностью.
А вот если индекс элемента массива заранее неизвестен, тогда да, обращение к элементу будет медленнее обращения к элементу структуры.
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
16.07.2015, 21:53
Renji, у точно и правда можно выкинуть. И зачем же компилятор так делает...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.07.2015, 21:54
Цитата Сообщение от VD Посмотреть сообщение
И зачем же компилятор так делает
Потому что оптимизации не включены
0
VD
 Аватар для VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
16.07.2015, 21:59
А почему он генерирует именно так а не иначе, без включенных оптимизаций?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.07.2015, 22:42
Цитата Сообщение от VD Посмотреть сообщение
А почему он генерирует именно так а не иначе, без включенных оптимизаций?
Потому что считает адрес элемента по формуле адрес массива+индекс элемента*размер элемента. А упрощать эту формулу, это уже считается за оптимизацию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.07.2015, 22:42
Помогаю со студенческими работами здесь

Обращение к элементу структуры через указатель
Добрый день. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define N 256 struct Video_Shop {

Обращение к элементу структуры (вектора) без явного указание онного
Доброго времени суток. Вопрос прям подмывает. есть структура struct xx{ int yy; int ww; } есть вектор

Обращение к элементу массива
Как мне обратиться к последнему элементу массива? например: Array // i = 0 тут нужно что бы -1 был последним т.е N-1 //можно ли с...

Обращение к элементу массива
Есть массив, который приходит мне в формате json, как мне обратиться к примеру ко второму элементу, к полю name? &quot;games&quot;:

Обращение к элементу массива
Доброго вечера! Напомните, пожалуйста, как правильно обращаться к элементу массива ? Часть кода: for (I=0; I&lt;mas.get_size();...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru