1

SharePoint ファームのすべての機能を検索し、特定の機能を探すアプリケーションがあります。引き戻される名前は見苦しい形式であるため、それらを比較してクリーンアップし、Xml ノードに追加します。次のようになります。

    if (featureName.Contains("target feature"))
    {
      if (featureName.Equals(Constants.IMAGING_FEATURE_CACHE_SERVICE))
      {
        string cleanFeatureName = "Caching Service Feature";
        XElement cleanName = new XElement("Item", cleanFeatureName);
        infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_IMAGE_SERVICE))
      {
       string cleanFeatureName = "Imaging Service Feature";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_HEALTH_RULES))
      {
       string cleanFeatureName = "Health Rules";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_INFRASTRUCTURE))
      {
       string cleanFeatureName = "Imaging Infrastructure";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_MONITORING))
      {
       string cleanFeatureName = "Monitoring";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
     }

このテストには、平均で約 2.3 ~ 2.4 秒かかります。速度を向上させる方法でこれらの文字列をフォーマット/置換できるより良い方法はありますか? switch / case ステートメントを実行することを検討しています。

4

3 に答える 3

3

必要なすべての置換情報をに入れることができますDictionary<string,string>...これにより、すべてのロジックが削除され、それぞれifから取得するための非常に高速な辞書ルックアップが残りますcleanFeatureNameConstants...

本質的には、基本的Dictionaryに起動時に1回入力すると、コードは次のように検索されます。

if (YourDictionary.ContainsKey (featureName))
{
string cleanFeatureName = YourDictionary[featureName];
XElement cleanName = new XElement("Item", cleanFeatureName);
infoTree.Add(cleanName);
}

featureNameこの方法では、特定の句は必要ありませんif...

Dictionary別のスレッドからアクセスする場合ConcurrentDictionaryは、.NET4以降で利用可能な非常に高速なスレッドセーフな辞書実装を使用します...

于 2012-11-13T14:24:38.263 に答える
1

コードを高速化するためにできることはいくつかあります。switchステートメントが役立つことは確かですが、string.Equalsについて知っておくべきことの1つは、同じエンコーディングを使用している場合は、StringComparison列挙型でオーバーロードを試す必要があるということです。OrdinalまたはOrdinalIgnoreCase(大文字と小文字を区別しない場合)の使用は、実際にはデフォルトのCultureまたはInvariantCultureよりもはるかに高速です。ただし、異なる文字セットを持つ異なるカルチャマシンで作業している場合、これはコードに影響を与える可能性があります。

if (featureName.Equals(Constants.IMAGING_FEATURE_CACHE_SERVICE, StringComparison.Ordinal))

これがあなたのスイッチがどのように見えるかです。明らかに、ケースの間にコードを入力し、各ケースの最後で常に休憩を取ります(戻ってこない限り)。また、デフォルトのケースを追加する必要がありますが、何もしないためにそこに休憩を入れることができます。

if (featureName.Contains("target feature"))
{
    switch(featureName)
    {
        case Constants.IMAGING_FEATURE_CACHE_SERVICE:
            string cleanFeatureName = "Caching Service Feature";
            XElement cleanName = new XElement("Item", cleanFeatureName);
            infoTree.Add(cleanName);
            break;
        case Constants.IMAGING_FEATURE_IMAGE_SERVICE:
            //Code here
            break;
        case Constants.IMAGING_FEATURE_HEALTH_RULES:
            //etc
            break;
        default:
            break;
    }
}
于 2012-11-13T14:36:15.217 に答える
1

最初の「if」が真である呼び出しの割合は?

完全な回答を得るには、それを知る必要があります。答えが「ほとんど」の場合は、そのテストを完全に削除する方が速いかもしれません。試してみて、いずれにしても見てください。

ただし、まず、すべての .Equals() を .Equals(target, StringComparison.Ordinal) に変更してみて、それが大きな違いを生むかどうかを確認してください。

すべての .Equals() を switch ステートメントに置き換えてみることもできます。

于 2012-11-13T14:33:24.857 に答える