Diferença entre uma variável local e uma variável chamada de um método? C #

votos
1

Gostaria de saber o que está mais rápido. Me ajude.

Eu tenho uma variável declarada em um método assim:

    public static Regex FindNumber()
{ return new Regex(@\d+, RegexOptions.IgnoreCase | RegexOptions.Compiled); }

Como você pode ver ele retorna uma expressão regular.

Eu também tenho um outro método que se parece com isso:

    private static string TestOne(string RawData)
{
    Regex rgxFindNumber = FindNumber();
    Regex rgxFindDays = FindDays();
    for (int i = 0; i < mc.Count; i++)
    {
        int days = Convert.ToInt32(rgxFindNumber.Match(rgxFindDays.Match(mc[i].Value).Value).Value);
    }
    return RawData;
}

Agora é o Método Testone vai ser mais rápido ou é TestTwo?

        private static string TestTwo(string RawData)
{
    for (int i = 0; i < mc.Count; i++)
    {
        int days = Convert.ToInt32(FindNumber().Match( FindDays().Match(mc[i].Value).Value).Value);
    }
    return RawData;
}

Agora estou curioso porque Testone pode ter chamado um monte horrível no meu código então eu gostaria de saber o que seria melhor para implementar.

Obrigado rapazes.

** Edit: ** O código que estou usando tem um extremamente grande classe. É um analisador de texto para um jogo de estratégia baseado em texto. Eu estou tentando refatorar um pouco e isso é o que eu estou querendo aqui. Se eu fizer criar uma variável privada para o Regex, não seria executado toda vez que a classe é acessada? Isso é a minha pergunta para você.

Publicado 19/05/2009 em 21:50
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

TestOneserá mais rápido do que TestTwo, porque você não está criando uma nova expressão regular para cada iteração do loop.

Isto tem dois benefícios:

  • O tempo utilizado para analisar e construir os objetos para o regex é feito apenas uma vez, em vez de mc.Countvezes
  • Menos pressão sobre a recolha de lixo desde menos objectos são construídos.

No entanto, gostaria de ir um passo além. Se você está sempre indo para retornar a mesma expressão regular, e você está preocupado com a velocidade, eu iria armazenar em cache desse objeto regex em um campo estático.

Por exemplo, você pode considerar o seguinte:

private static Regex _FindNumber;
public static Regex FindNumber()
{
    if (_FindNumber == null)
        _FindNumber = new Regex(@"\d+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
    return _FindNumber;
}

Isso criaria apenas um objeto, total, e mantê-lo ao redor.

No entanto, e aqui está a minha resposta real.

Para saber realmente qual vai ser o mais rápido, você vai ter de medir o seu código, opcionalmente com a minha variante jogado em boa medida, e depois decidir. Nunca decidir sobre otimizações sem dados concretos, você pode acabar passando tempo reescrever o código, que pode introduzir novos erros, que terão de fixação, o que você vai gastar mais tempo em diante, apenas para espremer mais 1% de desempenho.

As grandes otimizações são feitas através de algoritmos, como mudar o tipo de algoritmo de classificação, e só depois, se necessário, você passar para otimizações locais como sintonia loop.

Dito isto, gostaria de, pelo menos, evitar a construção do objeto no loop, que é apenas o senso comum.

Respondeu 19/05/2009 em 21:57
fonte usuário

votos
1

Tecnicamente, Testone será mais rápido, porque TestTwo está adicionando um quadro de pilha chamando FindNumber ().

Eu não sei quanta diferença isso vai fazer, eu duvido que seja muito. Seu método é estático, então realmente é só criar o objeto, que deve ser muito rápido.

Minha pergunta a você é porque você está usando uma chamada de função para retornar a mesma seqüência mais e mais? Por que você não apenas declarar uma variável real?

Gostar,

private static Regex _findNumber = new Regex(@"\d+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Respondeu 19/05/2009 em 21:56
fonte usuário

votos
1

Eu acredito que TestOneserá mais rápido porque, TestTwovocê está criando um novo Regexobjeto cada vez que você loop. Se FindDaysfor implementado o mesmo que FindNumberserá ainda pior, pois você estará criando dois objetos.

Respondeu 19/05/2009 em 21:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more