Dois loops diferentes ou duas condições em uma comparação de velocidade de loop

Aug 17 2020

Eu tenho dois loops agora e dentro deles há algumas atribuições, mas tenho que fazê-lo da maneira mais rápida.

        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.  
        }

Ao tentar obter um resultado melhor, pensei que poderia fazer como abaixo, mas o resultado parece pior.

    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.                          
    }

O que está errado ? Alguma ideia de como posso acelerar? (O mais importante é a velocidade, não pense em memória).

ps. Mudei o código por causa de alguns problemas de segurança, não me importo com erros de sintaxe e elementsOne.count= elementsTwo.count o mesmo quase o tempo todo. Não pense que há apenas 5 itens em loop, há outro loop externo, seu loop contínuo. Desculpe pelo meu Inglês

Respostas

1 l33t Aug 17 2020 at 17:53

Para desempenho, você definitivamente deve evitar ter ifinstruções em seus loops. An ifcausa ramificação, o que significa que você está nas mãos do preditor de ramificação da CPU.

Então, sim, você provavelmente verá um desempenho melhor se tiver cerca de 20 loops sem uma ifdeclaração que será verdadeira em 5% dos casos. Tente isso e veja se ajuda. Além disso, certifique-se de armazenar em cache o valor de Count(), pois isso pode implicar em um loop adicional.