Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个性能更好_C#_.net_Performance_Linq - Fatal编程技术网

C# 哪个性能更好

C# 哪个性能更好,c#,.net,performance,linq,C#,.net,Performance,Linq,以下哪项使用LINQ的性能更好 sets.FirstOrDefault(x=>x.name=="xxx") 或 此处的名称可以是null。我在我的应用程序中使用这种查询20多次 有更好的方法吗?如果您只运行这个~20次,它不会太重要,但是第一个选项会更快,因为第二个选项会执行额外的空检查。这两个语句之间有一个主要区别,所以您不能仅根据性能来判断它们 第一个更好,但第二个会给出不同的结果(因为它不检查大小写和变音) 或者,您可以像这样重写第二个: sets.FirstOrDefault(x

以下哪项使用LINQ的性能更好

sets.FirstOrDefault(x=>x.name=="xxx")

此处的名称可以是
null
。我在我的应用程序中使用这种查询20多次


有更好的方法吗?

如果您只运行这个~20次,它不会太重要,但是第一个选项会更快,因为第二个选项会执行额外的空检查。

这两个语句之间有一个主要区别,所以您不能仅根据性能来判断它们

第一个更好,但第二个会给出不同的结果(因为它不检查大小写和变音)

或者,您可以像这样重写第二个:

sets.FirstOrDefault(x => string.Equals(x.name, "xxx",StringComparison.OrdinalIgnoreCase));
它不需要
字符串.IsNullOrEmpty
,这将使第二个调用比原来快一点


正如前面提到的:
OrdinalIgnoreCase
的使用比
InvariantCultureIgnoreCase
的性能更好,因此是微软的。

我没有测试过它,但我打赌
集。FirstOrDefault(x=>x.name==“xxx”)
更快。原因很简单——它做的工作更少,而且更少的工作速度更快


尽管如此,这种性能改进通常是不值得的。通过查看应用程序的体系结构,您将获得更多的性能优势。

这是对对象的LINQ,还是其他什么?您是否有任何迹象表明这是您的性能瓶颈?两种方法你都试过了吗?(就我个人而言,为了可读性,我会选择第一个,除非你有任何具体证据表明第二个要快得多。)我不明白这个问题与LINQ有什么关系。@user2864740那又怎样?这两个代码段之间的区别在于字符串比较。所以问题应该是:这两种比较字符串的方法中哪一种更快?@dcastro不同意。首先,将苹果和橙子进行比较,其中一个无论如何都是错误的,根据定义,它永远不会返回正确的答案,因此速度较慢。其次,由于没有提供Linq提供程序,所以两个代码段都不是“完整的”,因此它们都没有实际运行。第三,某些Linq提供程序实际上无法转换一个或另一个
expression
。第四,有些Linq提供程序实际上会将这两个表达式编译成相同的代码。@dcastro正如Jon Skeet指出的那样,根据
集的提供程序不同,会有差异。假设
sets
是某个数据库表,第一个可能被转换为一个简单的sql查询,第二个可能无法,并且需要潜在地获取整个表。如果您没有测试它,您怎么知道它工作得更少?如果有的话,由于ASCII字符集的设置方式,
invariantCultureInogoreCase
可能会使每个字符少进行1位比较。其次,假设Linq2Object,由于出现null异常,第一个对象永远无法返回(抛出)。@weston的工作量更少,但并不意味着更快。当然,这取决于硬件。。。然而,最主要的收获是…不要假设使用perf,现代计算机有如此多的优化层次,你实际上不知道你的CPU上运行着什么(这是一件好事)。@Aron这并不是因为处理器不能一点一点地工作而减少工作。因此,他们仍然必须进行整个比较,然后应用掩码忽略他们不关心的位。所以不区分大小写的比较需要更多的工作。@weston一个更好的论点是,我们实际上是在UTF-8中工作的(您应该阅读Jon Skeet的《小马记》)。但我想表达的主要观点是,在这个级别上,它严重依赖于实现,事实上这是一件好事。现代程序员真的不应该考虑这些事情。请删除!状况良好。我将其标记为答案另一个速度改进(理论上)是使用
StringComparison.ordinallingorecase
sets.FirstOrDefault(x => string.Equals(x.name, "xxx",StringComparison.OrdinalIgnoreCase));