1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
1

Загружаются ли в кэш данные из оперативной памяти при использовании арифметики указателей

21.01.2019, 23:22. Показов 758. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет
Операции с массивами работают быстрее если использовать индексацию указателей, чем при арифметике указателей. почему так? может они не загружаются в кэш?
спасибо заранее
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2019, 23:22
Ответы с готовыми решениями:

Освобождение оперативной памяти при использовании Awesomium
Всем привет! Работаю с Awesomium, и всё было хорошо, пока я не открыл диспетчер задач. После...

Зависает компьютер намертво при использовании 2-х планок оперативной памяти
Недавно столкнулся с такой проблемой, намертво начал зависать компьютер, в основном в играх,...

Нюансы арифметики указателей: преобразование к char* при вычислении сдвига
Добрый день! Вчера, при чтении темы возник вопрос различия между указателями и массивами. В теме...

Данные из оперативной памяти
Подскажите пожалуйста, как нам перехватить данные любого приложения, которые "уходят" в оперативную...

9
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 01:12 2
Наоборот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <chrono>
int main()
{
    int a;
    int arr[5]{1,2,3,4,5};
     std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
    for(int i=0; i<5; i++)
    a=arr[i];
    end = std::chrono::system_clock::now();
 
    std::cout<< std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count()<<std::endl;
 
     start = std::chrono::system_clock::now();
     for(int i=0; i<5; i++)
     a=*(arr+i);
     
     end = std::chrono::system_clock::now();
 
    std::cout<< std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count()<<std::endl;
}
Output
291
130



Индексация работает дольше, потому что является оберткой для арифметики указателей, чтобы эту обертку "развернуть" нужно время
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
22.01.2019, 01:31  [ТС] 3
у меня все наоборот
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 01:37 4
большой ДЕН, киньте свой код и вывод от него
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
22.01.2019, 02:01 5
Pashka Durov, давайте лучше я вам код кину. Ваш же, но с небольшими изменениями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <chrono>
int main() {
//    int a;
//    int arr[5]{1,2,3,4,5};
     std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
//    for(int i=0; i<5; i++)
//    a=arr[i];
    end = std::chrono::system_clock::now();
 
    std::cout<< std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count()<<std::endl;
 
     start = std::chrono::system_clock::now();
//     for(int i=0; i<5; i++)
//     a=*(arr+i);
 
     end = std::chrono::system_clock::now();
 
    std::cout<< std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count()<<std::endl;
}
Запустите этот вариант, о результатах расскажите. Не понятно, что вы хотели выяснить на 5 итерациях, которые при сборке с оптимизацией будут вообще выброшены.

Добавлено через 9 минут
По сути, arr[i] и *(arr + i) это одно и то же.
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
22.01.2019, 02:05  [ТС] 6
я уже все потер. но как восстановлю выгружу сюда

Добавлено через 37 секунд
это было умножение матриц
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 02:14 7
Цитата Сообщение от valen10 Посмотреть сообщение
Запустите этот вариант, о результатах расскажите. Не понятно, что вы хотели выяснить на 5 итерациях, которые при сборке с оптимизацией будут вообще выброшены.
Прогнал через 10'000 итераций - результат тот же: разбег в районе 200 наносекунд

Добавлено через 7 минут
Цитата Сообщение от valen10 Посмотреть сообщение
давайте лучше я вам код кину
работает с таким output
100
60
0
18995 / 9936 / 2427
Регистрация: 30.01.2014
Сообщений: 17,471
22.01.2019, 13:45 8
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Прогнал через 10'000 итераций - результат тот же: разбег в районе 200 наносекунд
Если в том коде выше вы изменили только число итераций, то компилятор также их выбросил при оптимизации. Вы изменяете известные на этапе компиляции значения, результат также будет известен на этапе компиляции и подставлен уже в готовом виде.
Ваши 200 наносекунд - это погрешность измерений.

Добавлено через 3 минуты
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Индексация работает дольше, потому что является оберткой для арифметики указателей, чтобы эту обертку "развернуть" нужно время
Это "время" отсутствует на этапе исполнения.
Язык С++ компилируемый со статической типизацией, зачем бы ему тратить время на "разворачивание" языковых конструкций на этапе исполнения?
1
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 15:22 9
valen10, был не прав, извините
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
22.01.2019, 20:31  [ТС] 10
попробовал восстановить оба алгоритма. но, как и у вас, оба варианта работают одинаково. у меня был класс с реализациями умножения разных типов массивов. все было на указателях. попробовал с индексацией и все варианты заработали быстрее. все они работали правильно - никаких выходов за границы и т.п. я все думал: как тако может быть?
извините за ложную тревогу. как только опять такое обнаружу сразу же скину сюда код.
0
22.01.2019, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2019, 20:31
Помогаю со студенческими работами здесь

Ошибка при использовании указателей
Задание Составить программу, которая заполняет массив случайными целыми числами из диапазона,...

При каких микрокомандах при выполнении команды WR возможна модификация кэш-памяти
Добрый день, если есть те, кто знают CompModel, то не могли бы вы мне подсказать следующее. При...

Хранить данные в оперативной памяти
есть два класса , нужно хранить общие данные, при чём хранить и изменять быстро, пробывал делать...

Как считать данные с оперативной памяти?
Здравствуйте. На днях захотел сделать свой &quot;артмани&quot; на с#, но увы гугл не помог мне в этом...

Как удалить лишние данные из оперативной памяти?
Здравствуйте. Имеется вот такой код, вернее часть него: if( GetKeyState(32) &amp; 0x8000 ) { hdc...

Проблемы при использовании указателей для работы со строками
#include &lt;iostream&gt; using namespace std; int main() { char src; cin &gt;&gt; src; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru