c#字符串性能 - 比较更快,字符串文本或字符串长度

时间:2010-09-06 13:57:57

标签: c# .net performance string

嘿伙计们,我必须阅读一个巨大的xml文件,其中包含超过300万条记录和超过1000万个嵌套元素

我自然而然地使用xmltextreader并使用多个优化技巧和提示将解析时间从早期的90秒缩短到大约40秒

但我想进一步节省处理时间,因此我可以在问题之下

相当多的元素是xs:boolean类型,数据提供者总是将值表示为“true”或“false” - 从不“1”或“0”

对于这种情况,我最早的代码是:

if (xmlTextReader.Value == "true")
{
    bool subtitled = true;
}

我进一步优化为:

if (string.Equals(xmlTextReader.Value, "true", StringComparison.OrdinalIgnoreCase))
{
    bool subtitled = true;
}

我想知道下面是否会最快(因为它的“真”或“假”)?

if (xtr.value.length == 4)
{
    bool subtitled = true;
}

8 个答案:

答案 0 :(得分:7)

是的,它更快,因为你只比较一个值,即字符串的长度。

通过比较两个字符串,只要两个字符相同,就可以比较每个字符。因此,如果您找到字符串"true"的匹配项,那么在谓词评估为true之前,您将进行4次比较。

这个解决方案唯一的问题是,如果有一天价值会从true改为让我们说1,那么你将会遇到问题。

答案 1 :(得分:4)

比较长度会更快,但可读性更低。除非我描述代码的性能并得出结论我需要这种优化,否则我不会使用它。

答案 2 :(得分:3)

将第一个字符与“t”进行比较怎么样?

应该(也许:)比比较整个字符串更快..

答案 3 :(得分:2)

测量长度几乎总是更快。也就是说,除非这是微优化的实验,否则我只关注使代码可读并传达正确的语义。

您也可以尝试使用以下方法:

Boolean.TryParse(xmlTextReader.Value, out subtitled)

我知道这与你的问题无关,但我想我还是会把它扔出去。

答案 4 :(得分:0)

你不能写一个单元测试吗?例如,运行每个方案1000次并比较日期时间。

答案 5 :(得分:0)

如果你知道它是“真”或“假”,那么最后一个片段必须是最快的。

无论如何,你也可以写:

bool subtitled = (xtr.Value.length == 4);

那应该更快。

答案 6 :(得分:0)

我知道一个老问题,但是被接受的答案是错误的,或者至少是错误的解释。

比较长度可能稍快一点,但这只是因为string.Equals在检查长度并确定它们不等于字符串之前可能还会进行其他比较。

所以在实践中,这是最后的优化。

Here,您可以找到.NET核心字符串比较的源。

答案 7 :(得分:-2)

.Net中的字符串比较和解析非常慢,我建议在.Net中避免使用字符串解析/比较。

如果您被迫这样做 - 使用高度优化的非托管或不安全代码并使用并行性。

IMHO。