Cela semble réaliste; vous introduisez plus de complexité (plus de recherches etc, plus de méthodes virtuelles, plus de contrôles de gamme), donc ça ne peut que ralentir (l'accès au tableau est très direct et très rapide).
Il semble que vous puissiez l'obtenir un peu plus rapidement (mais pas aussi rapidement que le tableau) en implémentant un IComparer<T>
au lieu de l'approche déléguée; (modifier) et plus rapide à nouveau en utilisant IComparable<T>
:
Array.Sort: 2241ms
List.Sort (delegate): 8714ms
List.Sort (interface): 6976ms
List.Sort (comparable): 5456ms
Avec code:
using System;
using System.Collections.Generic;
using System.Diagnostics;
struct MyStruct : IComparable<MyStruct>
{
private readonly int key, value;
public int Key { get { return key; } }
public int Value { get { return value; } }
public MyStruct(int key, int value)
{
this.key = key;
this.value = value;
}
public int CompareTo(MyStruct other)
{
return key.CompareTo(other.key);
}
}
static class Program
{
static void Main()
{
const int SIZE = 10000000;
int[] a = new int[SIZE], b = new int[SIZE];
Random rand = new Random();
for(int i = 0 ; i < SIZE ; i++) {
a[i] = rand.Next();
b[i] = i;
}
var list = new List<MyStruct>(SIZE);
for (int i = 0; i < SIZE; i++)
{
list.Add(new MyStruct(a[i], b[i]));
}
var list2 = new List<MyStruct>(list);
var list3 = new List<MyStruct>(list);
var watch = Stopwatch.StartNew();
Array.Sort(a, b);
watch.Stop();
Console.WriteLine("Array.Sort: " + watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
list.Sort((x, y) => x.Key.CompareTo(y.Key));
watch.Stop();
Console.WriteLine("List.Sort (delegate): " + watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
list2.Sort(MyComparer.Default);
watch.Stop();
Console.WriteLine("List.Sort (interface): " + watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
list3.Sort();
watch.Stop();
Console.WriteLine("List.Sort (comparable): " + watch.ElapsedMilliseconds + "ms");
}
sealed class MyComparer : IComparer<MyStruct>
{
private MyComparer() { }
public static readonly MyComparer Default = new MyComparer();
public int Compare(MyStruct x, MyStruct y)
{
return x.Key.CompareTo(y.Key);
}
}
}
(noter éditée réponse à ajouter des mesures pour IComparable) –
Je suppose à la fois l'utilisation list.sort et Array.Sort quicksort qui signifie que la raison de la différence de performance doit être la façon dont les éléments sont accessibles. –
Oui. Les deux utilisent quicksort. Liste .Sort est une fraction plus lente que pour un tableau régulier, mais rien de tel que la différence pour le tri des paires de valeurs. –
rob