纯粹的查找速度单值类型c#?

Sno*_*owy 2 c# linq arrays performance

.NET 4.5.1

我有一堆Int16值,它们的范围是-4到32760.范围内的数字不是连续的,但它们的排序是从-4到32760.换句话说,16-302的数字是不在"束",但数字303-400在那里,数字2102不存在,等等.

什么是确定特定值(例如18400)是否在"束"中的全速最快方法?现在它在Int16 []中并且Linq Contains方法用于确定数值是否在数组中,但是如果有人可以说明为什么/如何不同的结构将更快地传递单个值,我将不胜感激.速度是此查找的关键("束"是静态类的静态属性).

有效的示例代码

Int16[] someShorts = new[] { (short)4 ,(short) 5 , (short)6};
var isInIt = someShorts.Contains( (short)4 );
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是可以完成的最高效的事情.

谢谢.

Jon*_*eet 8

这听起来像你真的想要BitArray- 只是将值偏移4,所以你有一个范围,[0, 32764]你应该没事.

这将分配一个有效4K大小(32764/8)的数组,在数组中每个值一位.它将处理查找数组中的相关元素,并应用位屏蔽.(我不知道它是使用byte[]内部还是其他东西.)

这是一个比存储范围更小的表示,但获取/设置位的唯一成本是计算索引(基本上是一个移位),将相关的内存位提供给CPU,然后进行位屏蔽.它需要1/8的大小bool[],使您的CPU缓存使用更有效.

当然,如果这对您来说确实是一个性能瓶颈,那么您应该将这个解决方案与bool[]实际应用程序中的方法进行比较- 微基准测试在这里与您的真实应用程序的行为并不重要.