Pular para o conteúdo principal

Contador fora do FOR?

Pequenas dicas do dia a dia para quem realmente gosta de programar.

Se a sincera frase de um ator desconhecido que diz "Honestidade em pequenas coisas nunca é uma coisa pequena" é verdade, então também venho a crer que qualidade de código em pequenos códigos nunca é tempo perdido.

Veja uma situação simples que foge de 70% dos bons desenvolvedores:

Suponhamos que você tenha que percorrer uma coleção de objetos que estão em um array.


1
var array = new string[arrayLength];

E precisa percorrê-lo.

É claro que o primeiro código que te vem a cabeça é


1
for (int i = 0; i < array.Length; i++) { /* qualquer coisa... */ }

Não tem problema, na minha também, mas o que você não sabe é que pequenas atitudes mudam o mundo. No código acima, todas as vezes que o loop for executado você também executará uma chamada ao método ...


1
array.Length

Agora, se puxarmos esta chamada para fora do laço, executaremos somente uma vez e todas as verificações sequenciais serão sobre uma constante.


1
2
3
4
5
var length = array.Length;
for (int i = 0; i < length; i++)
{ //tempo constante }

Não acredita que melhora?

Olha o tempo na execução do código abaixo.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int arrayLength = 10000;
            var array = new string[arrayLength];
            for (int i = 0; i < arrayLength; i++)
            {
                array[i] = string.Format("[{0}] = {1}"
                                , i.ToString()
                                , Guid.NewGuid());
            }

            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < array.Length; i++) { /* qualquer coisa... */ }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

            sw.Reset();
            sw.Start();
            var length = array.Length;
            for (int i = 0; i < length; i++)
            {
                //tempo constante
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

            Console.Read();
        }

    }
}



E só a título de curiosidade, se fizermos o foreach.



Interessante né?

Logo, mande bem com for e comparação fora do laço.

Comentários

Postagens mais visitadas deste blog

List sem repetição/duplicação? Use HASHSET!

Resultado da listagem Tem diferença! :) Mas como chegamos nisto? 1. Preparando listas para comparação Foram três. Todas com 32.767 registos. Uma totalmente sem repetições e com números sequenciais. Uma com poucas repetições (garantidas com números randômicos variando entre 1 e  32.767 / 2 :) e Uma com muitas repetições (também randômicos, entre 1 e 32.767  /  5) 2. Percorrendo e populando as novas listas  Como a classe List  não implementa validação de repetição, optamos por escolher o método mais usado (e aconselhável, principalmente onde trabalho :) que é o método Contains. if (!list.Contains(listaSemRepeticao[i]))                     list.Add(listaSemRepeticao[i]);  E na HashSet , inserção direta (porque ela já implementa a verificação de repetição). hash.Add(listaSemRepeticao[i]); E só! 3. Visualizando os resultados. Presentes na imagem acima. 4. Curiosidades ...