Cache miss (промах кеша)

Cache Miss (промах кеша) трапляється, коли запитувані дані відсутні в кеші і їх потрібно довантажувати з основного джерела.

При програмуванні високопродуктивних додатків важливо важливо навчитися писати т.зв. "Cache-friendly", дружній з кешем код. Щоб зрозуміти, що це таке, розглянемо нескладний приклад:

(Повний код прикладу можна подивитися тут)
Тут в двох циклах робиться, здавалося б, один і той же - збільшуються значення всіх чисел, на які посилаються обидва масиви. Здавалося б, чисел однакову кількість і робота проробляється однакова, але перший цикл стабільно працює в чотири рази швидше. Відбувається це тому що дані, на які посилається перший масив, лежать в пам'яті щільно, і, прочитавши i-й елемент цього масиву, в кеш ще автоматично потрапляють скільки-то наступних за ним елементів, звернення до яких буде вже проводитися дуже швидко. У другому ж масиві зберігаються посилання на елементи, виділені оператором new. який, хоч і намагається розташовувати дані щільніше, вдається це йому, як бачимо, з перемінним успіхом, дані виявляються розкиданими по пам'яті хаотично, і при читанні i-го елемента наступні після нього в кеш потрапляють рідко.

Часто для того, щоб збільшити "щільність" даних (ще вона називається локальностью) у вузьких місцях програми, використовуються свої менеджери пам'яті. Секрет в тому, що якщо ми заздалегідь знаємо, що нам знадобиться виділяти, наприклад, тільки шматки пам'яті однакового розміру або нам не доведеться їх видаляти, менеджер пам'яті може працювати істотно ефективніше "багатоцільового" стандартного.

Особливо часто нелокальність даних вбиває продуктивність, якщо в додатку широко використовується динамічне виділення пам'яті стандартними засобами на кшталт new або malloc для великої кількості маленьких об'єктів - вони знову ж виявляються розкидані по пам'яті "як попало" і простий доступ до них істотно сповільнюється.

Що таке Cache Miss (Промах кеша)?