Ваш вопрос недостаточно ясен, чтобы дать отдаленно точный ответ, но я думаю, что понимаю, куда вы направляетесь. Данные, которые вы перебираете, достаточно велики, поэтому, прежде чем вы дойдете до конца, вы начнете вытеснять данные, так что во второй раз (второй цикл) вы перебираете их, некоторые, если не все, придется читать снова.
Если два цикла были объединены таким образом, что каждый элемент/блок извлекается для первой операции, а затем уже находится в кеше для второй операции, то независимо от того, насколько велики данные по отношению к кешу, большинство, если не все вторые операции, будут взять свои данные из кеша.
Различные вещи, такие как природа кеша, цикл, вытесняемый данными, а затем выборка вытесняющих данных, могут вызвать некоторые промахи во второй операции. На ПК с операционной системой будет происходить много выселений, когда другие программы получают временные интервалы. Но если предположить, что в идеальном мире первая операция над индексом i данных извлекает их из памяти, вторая операция извлекает их из кеша.
Настройка кэша в лучшем случае сложна. Я регулярно демонстрирую, что даже со встроенной системой, без прерываний, с одной задачей, с одним и тем же исходным кодом. Время выполнения/производительность могут сильно различаться, просто изменяя параметры оптимизации компилятора, меняя компиляторы, обе марки компиляторов или версии компиляторов, gcc 2.x, 3.x и 4.x (кстати, gcc не обязательно производит более быстрый код с более новыми версиями). ) (и компилятор, который довольно хорош для многих целей, не очень хорош для какой-то одной конкретной цели). Один и тот же код с разными компиляторами или опциями может изменить время выполнения в несколько раз, в 3 раза быстрее, в 10 раз быстрее и т. д. Как только вы приступите к тестированию с кешем или без него, становится еще интереснее. Добавьте один nop в свой код запуска, чтобы вся ваша программа перемещала одну инструкцию в памяти, а ваши строки кэша теперь попадали в разные места. Тот же код компилятора. Повторите это с двумя nops, тремя nops и т. д. Тот же компилятор, тот же код, вы можете увидеть десятки процентов (для тестов, которые я провел в тот день на этой цели с этим компилятором) различий лучше и хуже. Это не означает, что вы не можете настроить кэш, это просто означает, что попытка выяснить, помогает ли ваша настройка или вредит, может быть трудной. Обычный ответ - просто "рассчитайте и посмотрите", но это больше не работает, и вы можете получить отличные результаты на своем компьютере в тот же день с этой программой с этим компилятором. Но завтра на своем компьютере или в любой другой день на чьем-либо компьютере вы можете делать все медленнее, а не быстрее. Вам нужно понять, почему то или иное изменение сделало его быстрее, возможно, это не было связано с вашим кодом, ваша почтовая программа могла загружать много почты в фоновом режиме во время одного теста, а не во время другого.
Предполагая, что я правильно понял ваш вопрос, я думаю, что одиночный цикл, вероятно, в целом быстрее.
person
old_timer
schedule
24.07.2010