Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144

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

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

Студворк — интернет-сервис помощи студентам
Привет
Операции с массивами работают быстрее если использовать индексацию указателей, чем при арифметике указателей. почему так? может они не загружаются в кэш?
спасибо заранее
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2019, 23:22
Ответы с готовыми решениями:

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

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

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

9
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 01:12
Наоборот
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  [ТС]
у меня все наоборот
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 01:37
большой ДЕН, киньте свой код и вывод от него
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
22.01.2019, 02:01
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  [ТС]
я уже все потер. но как восстановлю выгружу сюда

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

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

Добавлено через 3 минуты
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Индексация работает дольше, потому что является оберткой для арифметики указателей, чтобы эту обертку "развернуть" нужно время
Это "время" отсутствует на этапе исполнения.
Язык С++ компилируемый со статической типизацией, зачем бы ему тратить время на "разворачивание" языковых конструкций на этапе исполнения?
1
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
22.01.2019, 15:22
valen10, был не прав, извините
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
22.01.2019, 20:31  [ТС]
попробовал восстановить оба алгоритма. но, как и у вас, оба варианта работают одинаково. у меня был класс с реализациями умножения разных типов массивов. все было на указателях. попробовал с индексацией и все варианты заработали быстрее. все они работали правильно - никаких выходов за границы и т.п. я все думал: как тако может быть?
извините за ложную тревогу. как только опять такое обнаружу сразу же скину сюда код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2019, 20:31
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru