2015-07-08 4 views
0

Я запускаю симулятор, часть которого требует определенного массива пар значений. Когда я использовал Array.Sort (v1, v2), он сортирует 2 массива на основе первого, и все моделирование занимает примерно 9 мс. Но мне нужно сортировать на основе первого, а затем второго, поэтому я создал массив структур. См. Мой код ниже.C# sort array of structs

private struct ValueWithWeight : IComparable<ValueWithWeight> 
{ 
    public double Value; 
    public double Weight; 
    public int CompareTo(ValueWithWeight other) 
    { 
     int cmp = this.Value.CompareTo(other.Value); 
     if (cmp != 0) 
      return cmp; 
     else 
      return this.Weight.CompareTo(other.Weight); 
    } 
} 

void Usage() 
{ 
    ValueWithWeight[] data = FillData(); 
    Array.Sort(data); 
} 

Теперь это занимает примерно 27 мс. Есть ли лучший способ сортировки?

+7

И проблема, связанная с 27ms, является реальной проблемой? Вы уверены, что не микро-оптимизируете? –

+0

, если вы попытаетесь оптимизировать свой код любой ценой, он может сделать ваш код трудно понятным для себя. не заботитесь о 27ms или 9ms ... –

+4

Создайте правильный тест. Мы не знаем, как вы получаете числа, и из-за этого упомянутый порядок величины не имеет смысла. Вы также можете видеть неточность таймера. Также на самом деле возникает ваш вопрос: «Почему сравнение двух значений занимает примерно в два раза больше, чем сравнение одного значения» _? – CodeCaster

ответ

0

Поскольку вы собираетесь чрезвычайно оптимизировать его, пожалуйста, рассмотреть следующие:

  1. Array.sort работает над массивом и выполняет сравнение. В вашем случае не будет unboxing, так как вы реализовали интерфейс по структуре.

  2. Array.Sort выполняет своп элементов при сортировке. Подкачка является внутренне memmove. Ваша структура занимает не менее 16 байт. Вы можете попытаться уменьшить влияние, выделив свои двойные значения в классе. Класс всегда будет занимать байты IntPtr.Size (потому что вы будете хранить указатели), поэтому он должен копировать меньше байтов.

+0

Это может быть хорошей идеей, но никто точно не знает. Может быть, вы можете сделать некоторые эксперименты и сообщить о результатах, например, @ Jeppe? – ycsun

+0

Я попытался перейти на класс. Сроки от 27 до 33 – SparcU

+0

@SparcU проверит и сообщит результаты с моей стороны. Звучит странно. – PavPS