Ich habe implementiert nur ein sehr einfach binarysearch Algorithmus in C# für ganze Zahlen in einer Integer-Array zu finden:Warum ist C# Array.BinarySearch so schnell?
Binary Search
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;
}
Beim Vergleich nach C# 's nativen Array.BinarySearch()
kann ich sehen, dass Array.BinarySearch()
ist mehr als doppelt so schnell als meine Funktion, jedes einzelne Mal.
MSDN auf Array.BinarySearch:
Suchen ein ganzes eindimensionales sortiertes Array für ein bestimmtes Element, die IComparable generische Schnittstelle von jedem Elemente des Arrays und von dem angegebenen Objekt implementiert.
Was macht diesen Ansatz so schnell?
Prüfregeln
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;
}
}
Testergebnisse
+------------+--------------+--------------------+
| Attempt No | binarySearch | Array.BinarySearch |
+------------+--------------+--------------------+
| 1 | 2700ms | 1099ms |
| 2 | 2696ms | 1083ms |
| 3 | 2675ms | 1077ms |
| 4 | 2690ms | 1093ms |
| 5 | 2700ms | 1086ms |
+------------+--------------+--------------------+
Sie können einen Blick (http://referencesource.microsoft.com/#mscorlib/system/array.cs,b92d187c91d4c9a9) an der Quelle für Hinweise. – Blorgbeard
Haben Sie Ihren Test in Release außerhalb von VS ausgeführt? –
Ich habe es gerade getan, und auf meiner Maschine ist Ihr 'binarySearch' etwa 2,5 mal ** schneller ** als der' Array'. –