Два разных цикла или два условия в сравнении скорости цикла

Aug 17 2020

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

        for (var i = 0; i < Math.Min(data.elementsOne.Count(), 5)) ; i++) {
            if (data.PairSymbol == "xxx") { oldxxxA = xxxAa; xxxAa = data.elementsOne[0].Amount; oldxxxB = xxxBb; xxxBb = data.elementsTwo[0].Amount; }
            //I HAVE 20 IF BLOCK INSIDE OF IT.  
        }
        for (var i = 0; i < (Math.Min(data.elementsOne.Count(), 5)) || i < Math.Min(data.elementsTwo.Count(), 5); i++)
        {
            if (data.PairSymbol == "xxx") { oldxxxA = xxxAa; xxxAa = data.elementsOne[0].Amount; oldxxxB = xxxBb; xxxBb = data.elementsTwo[0].Amount; }
            //I HAVE 20 IF BLOCK INSIDE OF IT.  
        }

Когда я пытался получить лучший результат, я думал, что могу сделать это, как показано ниже, но результат выглядит хуже.

    for (var i = 0; i < (Math.Min(data.elementsOne.Count(), 5)) || i < Math.Min(data.elementsTwo.Count(), 5); i++)
    {
        if (data.PairSymbol == "xxx") { oldxxxA = xxxAa; xxxAa = data.elementsOne[0].Amount; oldxxxB = xxxBb; xxxBb = data.elementsTwo[0].Amount; } 
        //I HAVE 20 IF BLOCK INSIDE OF IT.                          
    }

Что не так ? Есть идеи, как я могу ускориться? (Самое главное - это скорость, не думайте о памяти).

пс. Я изменил код из-за некоторых проблем с безопасностью, не обращаю внимания на синтаксические ошибки и elementsOne.count = elementsTwo.count почти всегда одинаково. Не думайте, что в цикле всего 5 элементов, снаружи есть еще один цикл, его непрерывный цикл. Извините за мой английский

Ответы

1 l33t Aug 17 2020 at 17:53

Для повышения производительности вам определенно следует избегать использования ifоператоров в ваших циклах. ifВызывает ветвление , которое означает , что вы в руках ветви CPU предсказателя.

Так что да, вы, скорее всего, увидите лучшую производительность, если у вас будет около 20 циклов без ifутверждения, которое будет истинным примерно в 5% случаев. Попробуйте и посмотрите, поможет ли это. Кроме того, не забудьте кэшировать значение, Count()поскольку это может означать дополнительный цикл.