2014-02-01 4 views
0

Я пишу программу, в которой мне нужно несколько значений, чтобы всегда быть значением, варьирующимся от 0 до 255, я хочу, чтобы это было закрыто на 255, так сказать. Я хотел бы знать, что мой лучший вариант, производительность мудрым:Производительность: int vs. byte vs. custom int

  • INT, я должен был бы поместить многочисленные проверки в коде
  • байт, будет сгенерировано исключение, так что я по-прежнему нужно проверяет
  • пользовательских INT может быть запрограммирован на автоматическое подрезать значения вниз или увеличить их до того, что я хочу, но, возможно, не хватает производительности (не уверен)

Какой вариант лучше всего подходит для моей ситуации? (Другие предложения также приветствуются)

+2

«byte» выбрасывает исключение, поэтому мне все равно нужны проверки »- какие исключения вы имеете в виду? – astef

+2

Benchmark и убедитесь сами, что быстрее – MikeSW

+0

@astef О, может быть, я с ним что-то смутил, но у меня сложилось впечатление, что это вызовет исключение, если вы присвоите значение, выходящее за пределы диапазона? – Choraimy

ответ

3

Для чего-то вроде этого моя первая мысль была не о производительности, а об удобстве использования. Перспективное воздействие было бы трудно оценить без лучшего понимания вашего кода, и в конечном итоге профилировщик будет истинным судьей изменения. Вместо этого я бы сосредоточился на том, чтобы упростить его использование, а затем проверить perf этого решения.

Наличие нестандартного типа здесь не кажется необоснованным. Предположительно, вы хотели бы ограничить каждую отдельную операцию в 255 против ограничения конечного результата. Например 255 + 100 - 50 должен равняться 205 не 255. Если так пользовательский типа является лучшим выбором и может быть реализован по этим линиям

struct MyInt { 
    public readonly int Value; 

    public MyInt(int value) { 
    Value = Math.Min(value, 255); 
    } 

    public static MyInt operator+(MyInt left, MyInt right) { 
    return new MyInt(left.Value + right.Value); 
    } 

    public static MyInt operator-(MyInt left, MyInt right) { 
    return new MyInt(left.Value - right.Value); 
    } 

    // etc ... 
} 

Примечания по такому типу, вы должны также рассмотреть вопрос о внедрении интерфейсов, таких как IComparable , IComparable<T> и IEquatable<T>

+0

Не забывайте IComparable :) и метод ToInt() – MikeSW

+0

@MikeSW int напрямую доступен через 'Value'. Я перечислил интерфейсы, которые Op должен рассмотреть. – JaredPar

+0

Может ли поле 'readonly' быть изменено после того, как тип был создан? см. [только для чтения]) http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx). –

Смежные вопросы