使用字符串格式进行速度优化

时间:2012-11-13 14:20:06

标签: c# sharepoint sharepoint-2010 string-formatting

我有一个应用程序可以搜索所有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秒。有没有更好的方法可以以提高速度的方式格式化/替换这些字符串? 我正在考虑做一个转换/案例陈述。

3 个答案:

答案 0 :(得分:3)

您可以将所有需要的替换信息放入Dictionary<string,string> ...这将删除所有if逻辑,然后使用非常快速的字典查找从相应的{cleanFeatureName获取Constants... {1}}

从本质上讲,您基本上会在启动时填充Dictionary一次,然后您的代码会查找类似于此:

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

这样您就不需要任何featureName具体的if条款......

如果您从不同的线程访问Dictionary,那么使用ConcurrentDictionary这是一个非常快的.NET4及更高版本中可用的线程安全字典实现...

答案 1 :(得分:1)

第一个“如果”的呼叫占比是多少?

我需要知道给你一个完整的答案。如果答案是“最”,那么完全删除该测试可能会更快。无论如何都要试试看。

然而,对于初学者来说,尝试将所有.Equals()更改为.Equals(target,StringComparison.Ordinal),看看是否会产生很大的不同。

您也可以尝试用switch语句替换所有.Equals()。

答案 2 :(得分:1)

为了加快代码速度,您可以执行一些不同的操作。我确定switch语句可能会有所帮助,但是你应该知道有关string.Equals的一件事是,如果你使用相同的编码,你应该尝试使用StringComparison Enum重载。使用Ordinal或OrdinalIgnoreCase(如果您不关心大小写),实际上比默认的Culture或InvariantCulture快得多。如果在具有不同字符集的不同文化机器上工作,这可能会影响您的代码。

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

这就是你的swich的样子。显然在案例之间填写代码,并且在每个案例结束时总是休息一下(除非返回)。你还需要添加一个默认情况,尽管你可以在那里放一个休息时间来做什么。

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