Как мы можем узнать, находится ли структура в кэше ЦП или потеряла их в кеше памяти?

Я пытаюсь написать игровой фреймворк на C#, поэтому производительность здесь была критической

Вот ссылка, которую я нашел.

Вопрос в том, как мы можем узнать, что структуры все еще находятся в кеше процессора?

Если мы не можем, то какие сценарии проталкивают структуры в кэш-память.

Например, передайте структуру в List<>, а затем получите доступ к ним позже. Будет ли она все еще находиться в кэш-памяти процессора?

2 ответа

Почти все ответы на ваш вопрос зависят от того, что вы можете увидеть, если что-то находится в кэше ЦП, отладив процесс и проследив "Отладка -> Windows -> Регистры", где вы можете увидеть, какой адрес памяти загружен в каждый регистр и пройти через код вы можете увидеть, что что-то выходит и в. Это так далеко, как я могу пойти.

Я бы посоветовал вам использовать бенчмаркинг для микрооптимизации и только после этого начинать копать для более мелких деталей.

Как мы можем узнать, что структуры все еще находятся в кэше процессора?

Нет, не нужно знать.

Если мы не можем, то какие сценарии проталкивают структуры в кэш-память.

Он точно будет там при обработке, но будет утилизирован после него.

Переместите структуру в List <>, а затем получите доступ к ним позже. Будет ли она все еще находиться в кэше процессора?

Push a struct to List<> это операция с памятью, процессор будет делать push операции, но, вероятно, не нужно загружать его вообще, он может просто изменить pointer только. но данные будут partially или же sequentially загружается в CPU-кеш точно, если CPU НУЖНЫ эти данные позже.

Чтобы оптимизировать производительность кэша с помощью ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, она называется Cache-Conscious Data Structure, чтобы сделать структуры данных на основе указателей Cache Conscious, что значительно повысит производительность. Я провел 15 лет назад тест с C, который значительно улучшил производительность, примерно на 70%, но сейчас я потерял этот код.

Сначала вы должны быть профессионалом в использовании инструментов повышения производительности:

  1. Инструменты производительности Visual Studio предоставляют общие способы определения того, какая часть кода потребляет производительность на любом уровне.
  2. этот пост Типы значений и Типы ссылок - отличный пример для Benchmark Runner

невозможно реализовать фреймворк, который мог бы удовлетворить все предложения, так же как пример, на который вы ссылаетесь, это в каждом конкретном случае. Я думаю, что вы можете поставить контекст, тогда мы продолжим его обсуждение.

Кэш процессора значительно меньше по сравнению с памятью, его блоки загружают только необходимые данные, затем располагают их сразу после обработки, затем загружают следующие данные по следующему адресу памяти, если он там есть, но ссылочный тип может хранить данные NEXT где-то еще, но не NEXT, что снизит производительность, чтобы найти его. Вот почему появляются 3-уровневые кеши, 3-й кэш будет пытаться найти данные для 2-го, а 1-й будет использовать их из более быстрого кеша.

List<T> является ссылочным типом, который будет размещать экземпляр в разных блоках памяти heap, а затем сделать производительность немного хуже, но объекты типа значения используют stack, который мог бы хранить данные вместе, тогда процессор мог бы загружать их быстрее, но вы также должны указать операции, чтобы улучшить ваш случай, это не всегда универсально в любом реальном проекте.

На самом деле, чтобы улучшить производительность, LINQ переводит много видов объектов в тип значения structure вместо того, чтобы продолжать использовать class сам.

Другие вопросы по тегам