List <t> .IndexOf()与List <t> .FindIndex()的效率

时间:2015-08-12 12:51:11

标签: c# performance list

其中一个方法

  • List<T>.IndexOf()
  • List<T>.FindIndex()

在处理时间方面更有效率?

此实例中T的类型为String

2 个答案:

答案 0 :(得分:14)

IndexOf执行for循环,使用搜索对象的Equals实现来查找匹配项。 FindIndex也会执行for循环,但会评估Predicate以检查匹配。

他们每个都归结为一个for循环。性能差异(如果有的话)可以忽略不计。以下是一些MSDN摘录:

<强> List<T>.IndexOf Method (T)

  

此方法执行线性搜索;因此,此方法是O( n )操作,其中 n Count

<强> List<T>.FindIndex Method (Predicate<T>)

  

此方法执行线性搜索;因此,此方法是O( n )操作,其中 n Count

也就是说,两种功能的使用方式完全不同。前者假设您有一个列表中的对象,您只需知道列表中存在的索引(如果有)。

后者假设您了解某个对象的某些条件,并且您希望找到列表中的对象与该条件匹配的第一个索引。可能有多个匹配,但该方法返回第一个匹配。

答案 1 :(得分:5)

Cᴏʀʏ 建议性能差异可以忽略不计,如果有的话。因为我的直觉是使用委托总是会变慢,所以我决定对其进行测试。

使用 DotNetBenchMark 和以下代码进行测试:

[MemoryDiagnoser]
public class Bench
{
    byte[] buffer;

    public Bench()
    {
        buffer = new byte[1024];
    }

    [Benchmark]
    public void FindIndex()
    {
        int index = Array.FindIndex(buffer, x => x == byte.MaxValue);
    }

    [Benchmark]
    public void IndexOf()
    {
        int index = Array.IndexOf(buffer, byte.MaxValue);
    }
}
  • FindIndex 的平均运行时间为 1,986.2 ns
  • IndexOf 的平均运行时间为 178.4 ns

性能差异似乎不可忽略,因为它慢了 10 倍以上。

而且即使在数组第 16 个元素匹配的情况下,IndexOf 仍然比 FindIndex 快两倍多