2016-05-31 34 views
-4

是否有快速的替代方法,下面的代码:性能上的文本数据文件

bool isAlphabeticOnly(String strin) 
     { 
      foreach (char c in strin) 
      { 
       if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z')) 
        return false; 
      } 
      return true; 
     } 

在此先感谢。

+3

请提供您的基准测试代码,使人们可以测试对你自己的其他建议。 – Heinzi

+0

可能不会显着加快。 - 你短路,正在做快速比较。你确定你的逻辑是正确的吗? –

+1

此外,这是你的应用程序的瓶颈?为什么当你的应用中可能有其他部分可以做得更快时,你担心它的性能? –

回答

4

好了,这是实现更快一点(但的可读性

bool isAlphabeticOnly(String strin) { 
    // comparison with 0 - "i >= 0" - is faster than with strin.Length 
    for (int i = strin.Length - 1; i >= 0; --i) { 
    char c = strin[i]; 

    if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z')) 
     return false; 
    } 

    return true; 
} 

在我的工作站(.NET 4.5,IA64,酷睿i5 3.2GHz的)的平均时间是

Initial 2100 ms 
    This 1600 ms 

测量

// Yes, very long string 
String test = new String('p', 100000000) + new String('Q', 100000000); 

Stopwatch sw = new Stopwatch(); 

sw.Start(); 

isAlphabeticOnly(test); 

sw.Stop(); 

但是,如果您遇到性能问题,这不是isAlphabeticOnly你应该解决它。

+0

感谢您的帮助。我有'IsDigitsOnly','isPunctuation','isAlphaNumberic'和'isAlphabeticOnly'。我会实现你的建议逻辑(与0比较 - “i> = 0” - 比strict.Length更快)。还有什么我应该检查更好的表现? – Jogi

+0

@Rehan Khan:你可以尝试使用'Parallel.ForEach'等,但是这只会在* large *字符串上执行(多线程增加*开销*) –

+0

使用'.NET Profiler'来找出我的代码中最慢的部分。改变了逻辑,其性能至少提高了85%。 – Jogi

0

我只能用猫进行测试 - 你需要把所有的字母
不知道这是快,但值得测试

HashSet<char> hsAz = new HashSet<char> { 'a', 't', 'C' }; 
bool isAlphabeticOnlyHash(String strin) 
{ 
    for (int i = strin.Length - 1; i >= 0; --i) 
    { 
     if (!hsAz.Contains(strin[i])) 
      return false; 
    } 
    return true; 
} 
+1

对不起,我试过了,在我的工作站得到了'7100毫秒(初始解决方案有'2100')。这是值得测试的,但是在这种特殊情况下*计算哈希比直接比较运行速度慢。 –

+0

@RehanKhan“不知道这是否更快,但值得测试”的哪一部分不清楚? – Paparazzi

+0

@RehanKhan你的成长。你问了一个问题,我提出了一个有效的想法,试着开放。这是一个免费的网站,我们没有义务进行基准测试。 – Paparazzi