Как отмечает Бернард, сложность времени и памяти обоих предлагаемых решений идентична, и немного более сложная адресация, требуемая вторым решением, не замедлит работу современных процессоров. Но я не согласен с его предложением о том, что «Решение 2 скорее всего будет быстрее». Мы действительно недостаточно знаем, чтобы даже сказать, что теоретически это должно быть быстрее, и, за исключением, возможно, нескольких дегенеративных ситуаций, разница в фактической производительности, вероятно, будет неизмеримой.
Первая итерация цикла, скорее всего, будет медленнее. Кэш холодный, и для первого решения требуется две строки кэша для хранения первых элементов, а для второго - только один. Но после этого оба решения делают прямой линейный обход. У CPU не будет проблем с предварительной загрузкой дополнительных строк кеша, поэтому в большинстве ситуаций эти первоначальные дополнительные накладные расходы вряд ли будут иметь большое значение.
С другой стороны, вы записываете данные в этом цикле, поэтому некоторые из линий кэша, к которым вы обращаетесь, также становятся помеченными грязными (что означает, что их данные должны быть записаны обратно в общий кэш или основную память в конечном итоге, и они очиститься от других кеш-ядер).В решении 1, в зависимости от sizeof(string)
и sizeof(int)
, только 5-25% строк кэша становятся грязными. Решение 2, однако, каждый триллер, поэтому он может использовать большую пропускную способность памяти.
Так, некоторые вещи, которые могут сделать раствор-быстрее, являются:
- Список строк обрабатываемым чрезвычайно короток
...Do Stuff...
является (достаточно очень сложен, так что строки кэша, удерживающие данных очиститься из кэша L1)
некоторых вещей, которые могут сделать раствор 1 или более быстрым, чем решение 2:
- Списка строк Обрабатываемый умеренный до большого
...Do Stuff...
не очень сложен, поэтому кэш остается теплым
- Программы многопоточный, а другой поток хочет читать данные из
stringsToVisit
одновременно.
Суть в том, что это, вероятно, не имеет значения.
Профилировали ли вы каждую версию? –
Я думаю, что вы забыли объявить 'stringVisited' в решении 2 – Bernard
, чтобы узнать больше о том, что вы пытаетесь решить. В текущей логике, Во второй раз вам нечего будет посещать. – Satbir