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

在char[]或substring()上循环:C#中的效率?,c#,performance,C#,Performance,你们中有人知道什么更好吗: a。获取字符串s,转换为char数组并在其上循环,或 b。获取一个字符串s,在它的子字符串上循环(s.Substring(i,1)) 非常感谢任何提示。用一些大字符串分析这两个例程比研究和/或等待答案更快,但如果我不得不猜测,我打赌Ab听起来很奇怪。只是猜测,但是a听起来更快,当然也更容易理解 编辑: 因此,如果您想要索引,那么 for (int i = 0; i < s.Length; i++) //Do something with s[i] 选项b)

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

a。获取字符串
s
,转换为
char
数组并在其上循环,或

b。获取一个字符串
s
,在它的子字符串上循环(
s.Substring(i,1)


非常感谢任何提示。

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

b听起来很奇怪。只是猜测,但是a听起来更快,当然也更容易理解

编辑: 因此,如果您想要索引,那么

for (int i = 0; i < s.Length; i++)
  //Do something with s[i]
选项b)在子字符串上循环,效率非常低

最快的方法是

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

for (int i = 0; i < s.Length; i++) { char c = s[i]; ... }
(A) 它的效率要高得多。但为什么不这样做:

foreach (char c in s)

一些快速基准测试表明,这只是一点点(这取决于您试图做什么

您只需要检查特定索引中的字符,还是基于它们创建一个新字符串

请记住
SubString()
将返回一个新字符串。这可能会导致不必要的开销,具体取决于您尝试执行的操作。对问题的更清楚解释会有所帮助


另外,不要进行预优化。以您觉得更高效的方式编写代码。然后对其进行分析,如果它导致瓶颈,则解决此问题。

为什么要将字符串转换为字符数组?字符串类上有一个索引器,可让您获取单个字符:

char c = s[i];
你到底在做什么?当你正在执行的字符串操作有一个优化的方法时,它将大大优于你提出的任何类型的循环。举个简单的例子:

File.ReadAllLines(...);
...
Regex exp = new Regex(..., RegexOptions.Compiled);
foreach (line)
    exp.Match(...);
比以下速度慢得多:


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

string str = "TestString";
for (int i = 0; i < str.Length; i++)
{
    char c = str[i];
}
string str=“TestString”;
对于(int i=0;i
我记得……我不记得了。索引是相关的。这就是为什么我选择说“循环”而不是“迭代”。int index=0;foreach(char c in s){code index++;}我的理解是,foreach几乎总是一个性能冲击,不管它与生俱来的灵活性如何。添加了与索引的比较。“不要预先优化”:是的,问题是我正在尝试实现一个我已经证明正确的给定算法,我希望尽可能高效地编写它。它不会在任何地方造成瓶颈,而是在自身上,所以,我不是真正的预优化。只是优化。如果你已经做到了这一点,那么你可以从两个方面来运行它并测量差异。然后评估它是否正确有区别的话,如果有区别的话,选择一种基于这种测量的方法。@Carl:是的,你可能是对的。我的C#编码技能远远落后于我的数学技能……除了秒表之外,我甚至不知道如何进行分析…@Dervin有一些免费的分析工具。试试EQATEC。我没用过,但我听说它很好。还有一个JetBrains称为dotTrace。它不是免费的,但你可以下载试用版。很高兴知道。谢谢,乔。
char c = s[i];
File.ReadAllLines(...);
...
Regex exp = new Regex(..., RegexOptions.Compiled);
foreach (line)
    exp.Match(...);
File.ReadAllText(...);
...
foreach (match in Regex.Match(..., RegexOptions.Multiline))
    ...
string str = "TestString";
for (int i = 0; i < str.Length; i++)
{
    char c = str[i];
}