代码之家  ›  专栏  ›  技术社区  ›  Dervin Thunk

在char[]或substring()上循环:C中的效率

  •  2
  • Dervin Thunk  · 技术社区  · 15 年前

    你们中有人知道什么更好吗?

    获取字符串 s ,转换为 char 对其进行数组和循环,或者

    获取字符串 S ,循环它的子字符串( s.Substring(i, 1) )?

    任何小费都非常感谢。

    8 回复  |  直到 12 年前
        1
  •  12
  •   Henk Holterman    12 年前

    选择权 b) 循环子字符串的效率非常低。

    最快的方法是

    c) 使用只读索引器属性直接循环字符串字符:

    for (int i = 0; i < s.Length; i++) { char c = s[i]; ... }
    

    或者,基于 IEnumerable<char> 接口:

    foreach(char c in s) { ... }
    
        2
  •  6
  •   Matt Howells    15 年前

    (a)效率更高。但为什么不这么做呢:

    foreach (char c in s)
    

    一些快速基准测试表明,这比

    for(int i = 0; i < s.Length; ++i)
        char c = s[i];
    

    但我的观点是前者的可读性使得它在任何情况下都优于最关键的代码。

        3
  •  3
  •   Winston Smith    15 年前

    这取决于你想做什么。

    您只需要检查特定索引处的字符,或者基于它们创建一个新的字符串,或者什么?

    记得 SubString() 将返回新字符串。这可能会导致不必要的开销,这取决于您试图做什么。对这个问题作更清楚的解释会有所帮助。

    另外,不要预先优化。以您觉得更有效率的方式编写代码。然后分析它,如果它导致了瓶颈,就解决这个问题。

        4
  •  2
  •   Hardryv    15 年前

    用一些大字符串描述这两个例程比研究和/或等待答案要快,但如果我不得不猜测,我敢打赌

        5
  •  1
  •   Michael Burr    15 年前

    为什么要将字符串转换为char数组?在string类上有一个索引器,它允许您获取单个字符:

    char c = s[i];
    
        6
  •  1
  •   flq    15 年前

    听起来怪怪的。只是猜测,但是 听起来更快,当然更容易理解。

    编辑: 因此,如果你想要索引,你的老

    for (int i = 0; i < s.Length; i++)
      //Do something with s[i]
    

    会做的很好

    或者,对于一些Linq的过度杀伤力

    s.Select((i, c) => //i being index, c the char, or the other way round, I forget at times);
    
        7
  •  0
  •   Sam Harwell    15 年前

    什么 确切地 你在做?当您正在执行的字符串操作有一个优化方法时,它将远远超过您想到的任何类型的循环。举个简单的例子:

    File.ReadAllLines(...);
    ...
    Regex exp = new Regex(..., RegexOptions.Compiled);
    foreach (line)
        exp.Match(...);
    

    是多 更慢的 比:

    File.ReadAllText(...);
    ...
    foreach (match in Regex.Match(..., RegexOptions.Multiline))
        ...
    
        8
  •  0
  •   Raghav    15 年前

    在使用子字符串时,请记住它将为您提供新的字符串,而原始字符串将保持原样。wgy我是说,原始字符串将保持原样,因为.NET实习生的字符串,所以未来的实例将从实习生池中拉出相同的不可变字符串,任何性能影响都将忽略不计。在计算机科学中,字符串interning是一种只存储每个不同字符串值的一个副本的方法,必须是不可变的。在创建或实习字符串时,实习字符串会使一些字符串处理任务更加节省时间或空间,但代价是需要更多的时间。不同的值存储在一个字符串实习生池中。每个字符串的单个副本称为“intern”,通常由string类的方法查找。 因此,每次创建新字符串时都使用子字符串 因此,选择for循环选项而不是子字符串。

    string str = "TestString";
    for (int i = 0; i < str.Length; i++)
    {
        char c = str[i];
    }