La différence entre une variable locale et une variable appelée à partir d'une méthode? C #

voix
1

Je voudrais savoir ce qui est plus rapide. Aide moi.

J'ai une variable déclarée dans une méthode comme ceci:

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

Comme vous pouvez le voir renvoie une expression régulière.

J'ai aussi une autre méthode qui ressemble à ceci:

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

Maintenant, est la méthode testone va être plus rapide ou est 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;
}

Maintenant im curieux parce que testone peut obtenir appelé beaucoup aweful dans mon code, donc je voudrais savoir ce serait mieux de mettre en œuvre.

Merci les gars.

** Edit: ** Le code J'utilise a une classe extrêmement importante. Son un analyseur de texte pour un jeu de stratégie basé sur le texte. Je suis en train de le factoriser un peu et c'est ce que je me demande ici. Si je ne crée une variable privée pour l'expression rationnelle, ne serait-il être exécuté à chaque fois que la classe est accessible? Thats my question pour vous.

Créé 19/05/2009 à 21:50
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Je crois TestOnesera plus rapide parce que TestTwovous créez un nouvel Regexobjet à chaque fois que vous en boucle. Si FindDaysest mis en œuvre le même que FindNumberce sera encore pire que vous allez créer deux objets.

Créé 19/05/2009 à 21:52
source utilisateur

voix
1

Techniquement, testone sera plus rapide, parce que testtwo ajoute un cadre de pile en appelant FindNumber ().

Je ne sais pas combien il fera la différence, je doute que ce soit tant que ça. Votre méthode est statique, si vraiment il est juste créer l'objet, qui devrait être assez rapide.

Ma question est pourquoi utilisez-vous un appel de fonction pour retourner la même chaîne à plusieurs reprises? Pourquoi ne pas simplement déclarer une variable réelle?

Comme,

private static Regex _findNumber = new Regex(@"\d+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Créé 19/05/2009 à 21:56
source utilisateur

voix
4

TestOnesera plus rapide que TestTwo, parce que vous n'êtes pas créer une nouvelle expression régulière pour chaque itération de la boucle.

Cela présente deux avantages:

  • Le temps utilisé pour analyser et construire les objets pour la regex est effectuée qu'une seule fois, au lieu de mc.Countfois
  • Moins de pression sur la collecte des ordures depuis moins d'objets sont construits.

Cependant, je voudrais aller un peu plus loin. Si vous allez toujours revenir cette même expression régulière, et vous êtes préoccupé par la vitesse, je cache cet objet regex dans un champ statique.

Par exemple, vous pourriez envisager ceci:

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

Cela créerait un seul objet, au total, et le garder autour.

Cependant, et voici ma vraie réponse.

Pour en savoir en fait que l'on va être le plus rapide, vous allez devoir mesurer votre code, éventuellement avec ma variante pour faire bonne mesure, et de décider ensuite. Ne jamais se prononcer sur des optimisations sans données précises, vous risquez de réécrire le code passer du temps, ce qui peut introduire de nouveaux bugs, qui ont besoin de fixation, que vous passerez plus de temps, pour eek autre 1% de la performance.

Les grandes optimisations sont faites algorithmiquement, comme changer le type d'algorithme de tri, et seulement après, le cas échéant, de passer à des optimisations locales comme le réglage de la boucle.

Cela dit, je au moins éviter de construire l'objet dans la boucle, c'est juste du bon sens.

Créé 19/05/2009 à 21:57
source utilisateur

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