为什么C#Array.BinarySearch这么快?

丹尼尔

我已经在C#中实现了一个非常简单的binarySearch实现,用于在整数数组中查找整数:

二元搜寻

static int binarySearch(int[] arr, int i)
{
    int low = 0, high = arr.Length - 1, mid;

    while (low <= high)
    {
        mid = (low + high) / 2;

        if (i < arr[mid])
            high = mid - 1;

        else if (i > arr[mid])
            low = mid + 1;

        else
            return mid;
    }
    return -1;
}

当比较它与C#的母语Array.BinarySearch(),我可以看到Array.BinarySearch()两倍以上的速度作为我的功能,每一次。

Array.BinarySearch上的MSDN

使用Array的每个元素和指定对象实现的IComparable通用接口,在整个一维排序数组中搜索特定元素。

是什么使这种方法如此之快?

测试码

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        Random rnd = new Random();
        Stopwatch sw = new Stopwatch();

        const int ELEMENTS = 10000000;
        int temp;

        int[] arr = new int[ELEMENTS];

        for (int i = 0; i < ELEMENTS; i++)
            arr[i] = rnd.Next(int.MinValue,int.MaxValue);

        Array.Sort(arr);

        // Custom binarySearch

        sw.Restart();
        for (int i = 0; i < ELEMENTS; i++)
            temp = binarySearch(arr, i);
        sw.Stop();

        Console.WriteLine($"Elapsed time for custom binarySearch: {sw.ElapsedMilliseconds}ms");

        // C# Array.BinarySearch

        sw.Restart();
        for (int i = 0; i < ELEMENTS; i++)
            temp = Array.BinarySearch(arr,i);
        sw.Stop();

        Console.WriteLine($"Elapsed time for C# BinarySearch: {sw.ElapsedMilliseconds}ms");
    }

    static int binarySearch(int[] arr, int i)
    {
        int low = 0, high = arr.Length - 1, mid;

        while (low <= high)
        {
            mid = (low+high) / 2;

            if (i < arr[mid])
                high = mid - 1;

            else if (i > arr[mid])
                low = mid + 1;

            else
                return mid;
        }
        return -1;
    }
}

试验结果

+------------+--------------+--------------------+
| Attempt No | binarySearch | Array.BinarySearch |
+------------+--------------+--------------------+
|          1 | 2700ms       | 1099ms             |
|          2 | 2696ms       | 1083ms             |
|          3 | 2675ms       | 1077ms             |
|          4 | 2690ms       | 1093ms             |
|          5 | 2700ms       | 1086ms             |
+------------+--------------+--------------------+
安德鲁

在Visual Studio外部运行时,您的代码会更快:

您与阵列的:

From VS - Debug mode: 3248 vs 1113
From VS - Release mode: 2932 vs 1100
Running exe - Debug mode: 3152 vs 1104
Running exe - Release mode: 559 vs 1104

Array的代码可能已经在框架中进行了优化,但是比您的版本执行的检查要多得多(例如,如果版本arr.Length大于,则您的版本可能会溢出int.MaxValue / 2),并且如前所述,它是为多种类型设计的,而不仅仅是int[]

因此,基本上,仅当您调试代码时,它才会变慢,因为Array的代码始终在发行版中运行,并且幕后控制较少。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么C#OrderBy这么快?

来自分类Dev

为什么std :: rotate这么快?

来自分类Dev

Python集排序,为什么这么快?

来自分类Dev

为什么jQuery的$ .each这么快?

来自分类Dev

与SQLite相比,为什么Realm这么快?

来自分类Dev

为什么heapq.heapify这么快?

来自分类Dev

为什么Regex的Matches功能这么快?

来自分类Dev

为什么Numpy的克朗这么快?

来自分类Dev

为什么`updatedb`程序运行这么快?

来自分类Dev

为什么SSD比原始NAND这么快?

来自分类Dev

为什么流浪汉这么快?

来自分类Dev

F#:为什么Array.createZero这么快?

来自分类Dev

F#:为什么Array.createZero这么快?

来自分类Dev

为什么在C#中我的计算比Python这么快

来自分类Dev

为什么重塑这么快?(剧透:写时复制)

来自分类Dev

为什么`if`在语句前检查比在语句后检查这么快?

来自分类Dev

为什么像操作员这么快

来自分类Dev

为什么用jQuery元素包装元素这么快

来自分类Dev

为什么Eigens mean()方法比sum()这么快?

来自分类Dev

为什么“范围为(1000000000000000(1000000000000001))”?Python 3这么快?

来自分类Dev

为什么Clang这么快分配std :: complex?

来自分类Dev

为什么RSSurfaceView类被弃用这么快?

来自分类Dev

为什么像操作员这么快

来自分类Dev

为什么Ext4磁盘检查比NTFS这么快?

来自分类Dev

为什么使用HTTPS over HTTP时HttpClient这么快?

来自分类Dev

为什么磁盘上的空间这么快用完?

来自分类Dev

为什么搜索空字符串这么快?

来自分类Dev

终端中的“定位”命令。为什么这么快?

来自分类Dev

为什么在Java中此代码比在C ++和C#中这么快

Related 相关文章

热门标签

归档