- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
讨论来自 this answer让我好奇。哪个更快:
someEnumerable.Single(predicate);
或
someEnumerable.Where(predicate).Single();
毕竟,第一个更短、更简洁,而且似乎是专门设计的。
甚至 ReSharper 也建议前者:
我在上一篇文章中争论过,它们在功能上是相同的,并且应该具有非常相似的运行时间。
最佳答案
没有什么比基准更能回答这样的问题了:
(已更新)
class Program
{
const int N = 10000;
volatile private static int s_val;
static void DoTest(IEnumerable<int> data, int[] selectors) {
Stopwatch s;
// Using .Single(predicate)
s = Stopwatch.StartNew();
foreach (var t in selectors) {
s_val = data.Single(x => x == t);
}
s.Stop();
Console.WriteLine(" {0} calls to Single(predicate) took {1} ms.",
selectors.Length, s.ElapsedMilliseconds);
// Using .Where(predicate).Single()
s = Stopwatch.StartNew();
foreach (int t in selectors) {
s_val = data.Where(x => x == t).Single();
}
s.Stop();
Console.WriteLine(" {0} calls to Where(predicate).Single() took {1} ms.",
selectors.Length, s.ElapsedMilliseconds);
}
public static void Main(string[] args) {
var R = new Random();
var selectors = Enumerable.Range(0, N).Select(_ => R.Next(0, N)).ToArray();
Console.WriteLine("Using IEnumerable<int> (Enumerable.Range())");
DoTest(Enumerable.Range(0, 10 * N), selectors);
Console.WriteLine("Using int[]");
DoTest(Enumerable.Range(0, 10*N).ToArray(), selectors);
Console.WriteLine("Using List<int>");
DoTest(Enumerable.Range(0, 10 * N).ToList(), selectors);
Console.ReadKey();
}
}
有些令人震惊的是,.Where(predicate).Single()
以大约两倍的优势获胜。我什至将这两个案例都运行了两次,以确保缓存等不是一个因素。
1) 10000 calls to Single(predicate) took 7938 ms.
1) 10000 calls to Where(predicate).Single() took 3795 ms.
2) 10000 calls to Single(predicate) took 8132 ms.
2) 10000 calls to Where(predicate).Single() took 4318 ms.
更新结果:
Using IEnumerable<int> (Enumerable.Range())
10000 calls to Single(predicate) took 7838 ms.
10000 calls to Where(predicate).Single() took 8104 ms.
Using int[]
10000 calls to Single(predicate) took 8859 ms.
10000 calls to Where(predicate).Single() took 2970 ms.
Using List<int>
10000 calls to Single(predicate) took 9523 ms.
10000 calls to Where(predicate).Single() took 3781 ms.
关于c# - 哪个更快 : Single(predicate) or Where(predicate). Single(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194750/
以下各项之间是否存在明显的性能差异: something.Where(predicate).FirstOrDefault(); 和 something.FirstOrDefault(predicate
讨论来自 this answer让我好奇。哪个更快: someEnumerable.Single(predicate); 或 someEnumerable.Where(predicate).Singl
我知道这个问题是asked a lot by people甚至有人说 So, first(FirstOrDefault(predicate)) one is better in terms of pe
我一直在编写我的 LINQ 查询时使用 Where 子句中的谓词,后跟 FirstOrDefault 子句。我开始在 FirstOrDefault 子句中看到带有谓词的示例。 这个比那个好吗? EF
据我所知,在 Java 8 中引入谓词之前,Guava 中的谓词是为了填补 Java 中的空白而创建的。现在当 Java 中有这样的功能时,使用 Guava 谓词是否仍然有意义?这有什么附加值吗? 最
在 Java 中是否有某种标准方法来表达一个操作来测试一个 Predicate 是否比另一个 Predicate 更严格? 我可以想象类似 pred1.isStricterThan(pred2) 的东
在 Guava 中,Predicates 类有一种名为“or”或“and”的实用方法,您可以传递一个可迭代的或两个谓词。 我有一个如下代码示例: class AccountNamePredicate
检查 IEnumerable 集合是否多于或少于 X 个满足谓词的元素的最佳方法是什么? 我目前正在使用 .Count(lambda) limit。但是,如果您的列表是 ICollection,则
我正在做一些性能测试并注意到像这样的 LINQ 表达式 result = list.First(f => f.Id == i).Property 比慢 result = list.Where(f =>
标题说明了一切。如果我有一个字段 private Predicate myPredicate; 为什么我不能分配一个 Predicate 那个领域的实例? 最佳答案 因为 Predicate 实现逆
我没有找到恒等式 Predicate我预计在 com.google.common.base.Predicates所以我把它搞砸了。我发现它对于单元测试中关于集合的精确行为的断言很有用(例如 Multi
简介 今天在测试某些 LinQ 函数的性能差异时,我注意到 LastOrDefault(predicate) 几乎总是比 FirstOrDefault(predicate) 快,这让我有点吃惊感兴趣,
这是我的代码。 import java.util.stream.Stream; import java.util.List; import java.util.ArrayList; import ja
我有课SomeObject其中有一个功能Evaluate()返回一个 bool 值。如果我有一个 IList像这样: IList parameters; parameters.Add( objA );
我必须执行and()在我的实现 Predicate 的业务对象上. 出现问题的代码是 and() 行调用: Predicate predicate = new M
我有一个核心数据数据库,我正在尝试使用 block 谓词创建获取请求,但我收到未知谓词错误: NOTE: employeeToHouse is a property of type House tha
请帮助这个 Linq 新手! 我正在我的测试类中创建一个列表,我想使用 Moq 来检查结果。 我可以很容易地组合一个谓词来检查列表的结果。然后如何将该谓词变成表达式? var myList = new
Expression> predicate = null; var query2 = query.Join(partJoinTableRepository.GetPartJoinQuery(),
我正在尝试与流 api 一起使用的预定义身份过滤器。不幸的是,我无法正确返回符合 stream api documentation 的通用谓词。 . 根据这里的反编译器是 Stream::filter
你如何解释归纳谓词?它们是做什么用的?他们背后的理论是什么?它们仅存在于依赖类型系统中,还是也存在于其他系统中?它们在某种程度上与 GADT 相关吗?为什么它们在 Coq 中默认为 true? 这是
我是一名优秀的程序员,十分优秀!