SORU
2 Aralık 2009, ÇARŞAMBA


C# Sıralama ve karşılaştırma OrderBy

Bir listeyi Sıralamak veya OrderBy kullanarak sıralama yapabilirim. Hangisi daha hızlı? Her ikisi de aynı çalışıyor algoritma?

List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));

1.

persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));

2.

var query = persons.OrderBy(n => n.Name, new NameComparer());

class NameComparer : IComparer<string>
{
    public int Compare(string x,string y)
    {
      return  string.Compare(x, y, true);
    }
}

CEVAP
2 Aralık 2009, ÇARŞAMBA


Neden ölçü değil:

class Program
{
    class NameComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            return string.Compare(x, y, true);
        }
    }

    class Person
    {
        public Person(string id, string name)
        {
            Id = id;
            Name = name;
        }
        public string Id { get; set; }
        public string Name { get; set; }
    }

    static void Main()
    {
        List<Person> persons = new List<Person>();
        persons.Add(new Person("P005", "Janson"));
        persons.Add(new Person("P002", "Aravind"));
        persons.Add(new Person("P007", "Kazhal"));

        Sort(persons);
        OrderBy(persons);

        const int COUNT = 1000000;
        Stopwatch watch = Stopwatch.StartNew();
        for (int i = 0; i < COUNT; i  )
        {
            Sort(persons);
        }
        watch.Stop();
        Console.WriteLine("Sort: {0}ms", watch.ElapsedMilliseconds);

        watch = Stopwatch.StartNew();
        for (int i = 0; i < COUNT; i  )
        {
            OrderBy(persons);
        }
        watch.Stop();
        Console.WriteLine("OrderBy: {0}ms", watch.ElapsedMilliseconds);
    }

    static void Sort(List<Person> list)
    {
        list.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true));
    }

    static void OrderBy(List<Person> list)
    {
        var result = list.OrderBy(n => n.Name, new NameComparer()).ToArray();
    }
}

Serbest modunda derlenmiş bilgisayarımda bu program baskılar

Sort: 1162ms
OrderBy: 1269ms


GÜNCELLEME:

@Önerdiği gibi Stefan burada büyük bir liste daha az zaman sıralama sonuçları

List<Person> persons = new List<Person>();
for (int i = 0; i < 100000; i  )
{
    persons.Add(new Person("P"   i.ToString(), "Janson"   i.ToString()));
}

Sort(persons);
OrderBy(persons);

const int COUNT = 30;
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < COUNT; i  )
{
    Sort(persons);
}
watch.Stop();
Console.WriteLine("Sort: {0}ms", watch.ElapsedMilliseconds);

watch = Stopwatch.StartNew();
for (int i = 0; i < COUNT; i  )
{
    OrderBy(persons);
}
watch.Stop();
Console.WriteLine("OrderBy: {0}ms", watch.ElapsedMilliseconds);

Baskı:

Sort: 8965ms
OrderBy: 8460ms

Bu senaryoda OrderBy daha iyi yapar gibi görünüyor.


UPDATE2:

Ve kullanarak rasgele isimler:

List<Person> persons = new List<Person>();
for (int i = 0; i < 100000; i  )
{
    persons.Add(new Person("P"   i.ToString(), RandomString(5, true)));
}

Nereye:

private static Random randomSeed = new Random();
public static string RandomString(int size, bool lowerCase)
{
    var sb = new StringBuilder(size);
    int start = (lowerCase) ? 97 : 65;
    for (int i = 0; i < size; i  )
    {
        sb.Append((char)(26 * randomSeed.NextDouble()   start));
    }
    return sb.ToString();
}

Verim:

Sort: 8968ms
OrderBy: 8728ms

Hala OrderBy daha hızlı

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • graham025

    graham025

    25 NİSAN 2006
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006
  • superemposed

    superemposed

    25 Aralık 2007