2010-11-10 5 views
0

c'est probablement aller au-dessus, mais j'étais après une fonction qui assigne une valeur à ma propriété de classe si la valeur de la base de données n'est pas nulle et ne fait rien si c'est le cas. Je pourrais le faire avec des déclarations si mais j'étais après un seul paquebot. Je veux que cela se passe partout dans mon code, mais avant cela, je me demandais si c'était la bonne façon d'y arriver avec la performance en tête. Merci.Tous les problèmes de performances avec ce code

Indicatif téléphonique: attribuer (variable, valeur)

Utils.Assign(dataSet.Tables[0].Rows[0]["Assigned"], ref this.Assigned); 

Utils Fonctions:

public static void Assign(object value, ref Boolean variable) 
{ 
    if (IsRealString(value)) // Check 
    { 
     switch (IsBoolean(value.ToString())) { case true: variable = Convert.ToBoolean(value); break; } 
    } 
} 

public static Boolean IsBoolean(String s) 
{ 
    Boolean bit; 
    if (Boolean.TryParse(s, out bit)) 
     return true; 
    else 
     return false; 
} 

public static bool IsRealString(object s) 
{ 
    return s != null && !String.IsNullOrEmpty(s.ToString()); 
} 

Répondre

1

Il existe quelques problèmes avec le code qui vont bien au-delà des performances. Tout d'abord, s'inquiéter de l'exactitude et la lisibilité, et puis vous pouvez vous soucier de la performance - et cela devrait être fait en mesurant/profilage. Il est hautement improbable que ce type de code soit le goulot d'étranglement, donc commencer par "optimiser" ici ne vaudra probablement pas votre temps.

Notez que IsRealString ne renverra pas une réponse fiable. La méthode prend un objet, donc le ToString par défaut pour n'importe quel objet donnera une chaîne non vide, ce qui retournera vrai.

Vous avez dit que vous voulez:

une fonction qui attribue une valeur à ma propriété de classe si la valeur de la base de données est nulle et ne rien faire si elle est

Vous pouvez préciser cela un peu:

  1. Si la valeur de la base de données est nulle, ne rien
  2. Sinon, affectez la valeur à la propriété de ma classe

Vous disposez maintenant d'une définition claire et concise de ce que vous voulez faire de votre fonction. Si votre implémentation suit cette description, il est probable qu'elle soit simple et correcte, ce qui est un excellent point de départ.

permet donc essayer:

public static void Assign(object value, ref bool variable) 
{ 
    if (value == null) return; 

    // We're assuming that a valid value will always be a string. If this is not the 
    // case, then we need to handle other types 

    string valueString = value as string; 

    bool result; 
    if (bool.TryParse(valueString, out result)) 
    { 
     variable = result; 
    } 
} 

Note: ceci est le même que l'échantillon de Greg, sauf que je voudrais éviter d'appeler ToString(), puisque nous ne savons pas ce que la mise en œuvre de l'objet fait.

Nous découvrons également un problème avec la définition de notre "spec". L'hypothèse dans votre code (et mon) est que si une valeur est "définie", elle sera toujours définie sur une chaîne. Vous pouvez avoir un jeu de données dans lequel les valeurs sont et non. Si, par exemple, la valeur était boolean, l'analyse valueString ne donnera pas un résultat valide. Cela dépend vraiment de ce que contient votre ensemble de données.

1

Y at-il une raison que vous faites une instruction switch sur un type booléen? C'est ce que si les déclarations sont pour. Je ne vois aucun code sensible à la performance ici à s'inquiéter du tout. Allez résoudre de plus gros problèmes qui sont de vrais problèmes et arrêtez de chasser les fantômes.

+0

:) Je sais ce que vous dites, mais je préférerais partir du début et passer à autre chose. Je suppose que la performance n'était probablement pas le bon mot, ce qui devrait probablement être la bonne façon de s'y prendre. – Luke

+0

Un 'switch' sur un' boolean' est un gros no-no. – leppie

0

i écrirait la méthode IsRealString comme suit:

public static bool IsRealString(object s) 
{ 
    return String.IsNullOrEmpty(s); 
} 

mais bien sûr, cela apporte aucune amélioration réelle en termes de vitesse :)

et la seconde fonction:

public static Boolean IsBoolean(String s) 
{ 
    Boolean bit = false; 
    return Boolean.TryParse(s, out bit); 
} 
+1

No good, 'String.IsNullOrEmpty' prend une chaîne comme argument, pas comme objet. – Greg

+0

Je crois que vous pouvez le lancer, ou n'est-ce pas coulé implicitement? –

2

Rien de majeur, mais vous convertissez value à un booléen deux fois et utilisez une instruction switch comme une instruction if. Le vrai problème ici est la lisibilité, pas la performance. Je recommande de simplifier les choses:

public static void Assign(object value, ref bool variable) 
{ 
    if (value == null) return; 

    bool result; 
    if (Boolean.TryParse(value.ToString(), out result)) 
    { 
     variable = result; 
    } 
} 
1

S'il y a des problèmes de performances, vous devriez pouvoir les mesurer avec un profileur. Avant de ne pas les mesurer, n'essayez pas d'améliorer les performances. Comme vous encapsulez ce code, vous pourrez toujours l'améliorer facilement.

Mais notez que si vous avez une base de données, la base de données sera votre goulot d'étranglement et non cette partie du code. Définitivement!

La raison pour laquelle vous ne devez PAS essayer d'accélérer le code est que cela rend généralement le code moins lisible. Cependant, vous pouvez suivre les suggestions faites par d'autres (si à la place de switch, simplifiez IsRealString()) et si vous avez vraiment besoin de IsBoolean() ou appelez simplement Boolean.TryParse depuis Assign() car cela améliorerait la lisibilité!

Questions connexes