Вы можете разработать эталонный тест специально для разрушения кэша. Например, выделите указанные блоки данных таким образом, чтобы они все гарантированно находились в разных строках кэша (скажем, с помощью специального распределителя памяти, который распределяет выделения как минимум на несколько сотен байтов). Затем многократно выполняйте итерацию по нескольким объектам, слишком большим, чтобы вместить все, даже в кэш L2 (очень зависит от платформы, поскольку это зависит от количества строк в кэше, но 1 миллион будет охватывать большинство архитектур и потребовать всего несколько сотен мегабайт ОЗУ всего).
Это даст вам верхний предел прироста производительности при переходе с X на Y. Но это достигается за счет снижения производительности X до уровня ниже любого вероятного реального использования. И чтобы доказать ваш случай, вам нужна оценка нижнего предела, а не оценка верхнего предела. Поэтому я не уверен, что вы многого добьетесь, если только не обнаружите, что даже этот наихудший случай все еще не имеет существенного значения, и вам не нужно беспокоиться об оптимизации.
Даже если вы не стремитесь к теоретической производительности X для наихудшего случая, любой тест, рассчитанный на превышение кеша, просто выбирает произвольную точку плохой производительности X и смотрит, лучше ли Y. Это не так уж далеко от фальсификации теста, чтобы Y выглядел хорошо. Это действительно не имеет значения, как ваш код работает в хитрых тестах, за исключением, может быть, для целей маркетинга ложь литература.
Лучший способ оценить разницу в производительности в реальном мире - это измерить реального клиента вашего класса. Вы говорите, что «семантика X и Y отличается другими тонкими способами, не связанными с этой оптимизацией», и в этом случае я могу только рекомендовать вам написать класс Z, который отличается от X только в отношении этого оптимизации и используйте это в своем приложении для сравнения.
Как только ваши тесты пытаются представить худшее реалистичное использование, тогда, если вы не видите никакой разницы в производительности, вероятно, выигрыша в производительности не будет.
Все это говорит о том, что если это имеет логический смысл (то есть код не делает код более удивительным), то я бы рекомендовал минимизировать количество выделений кучи в C ++ просто как практическое правило. Это не приводит к ухудшению скорости или общего использования памяти, а также упрощает обработку ресурсов. Практическое правило, конечно, не оправдывает переписывание рабочего кода.