Использование различных типов числовых переменных

Im все еще довольно новый, так что несите меня на этом, мой вопрос не должен быть спорным или мелочным, но во время чтения кое-что показалось мне странным.

Im в предположении, что когда компьютеры были медленными, а память была дорогой, используя правильный тип переменной, была гораздо более необходима, чем сегодня. Теперь, когда память немного легче пришла, люди, похоже, немного расслабились. Например, вы видите этот пример кода везде:

for (int i = 0; i < length; i++)

Int? (-2,147,483,648 до 2,147,483,648) для длины? Is not byte (0-255) лучший выбор?

Итак, мне интересно ваше мнение и то, что вы считаете лучшей практикой, мне не нравится думать, что это будет использоваться только потому, что аббревиатура "int" более понятна для новичка... или память просто стала настолько дешевой, что нам действительно не нужно беспокоиться о таких мелочных вещах, и поэтому мы должны просто использовать долго, чтобы мы могли быть уверены, что любые другие числа/типы (в пределах разумного), которые могут быть использованы, могут быть автоматизированы?

... или я просто глупо относиться к себе такими вещами?

Ответ 1

Luca Bolognese опубликовал этот в своем блоге.

Здесь соответствующая часть:

  • Используйте int, когда ваши значения могут вписываться в int, даже для значений, которые никогда не могут быть отрицательный
  • Используйте long, когда ваши значения не могут вписаться в int.
  • Байт, sbyte, short, ushort, uint и ulong должны использоваться только для взаимодействия с кодом C. В противном случае они не стоят хлопот.

Ответ 2

Использование переменной, которая меньше, чем размер регистра центрального процессора, может фактически привести к выпуску большего количества кода.

Как сказал еще один плакат, не беспокойтесь о микрооптимизации. Если у вас проблема с производительностью, первый профиль. В 9 раз из 10 ваша проблема с производительностью не будет такой, как вы думали.

Ответ 3

Нет, я не думаю, что ты глупый, это отличный вопрос!

Мое мнение состоит в том, что использование сильно типизированных переменных является лучшей практикой. В вашем примере переменная i всегда положительна, поэтому она может быть unsigned int.

При разработке программ нам нужно учитывать: 1) размер 2) скорость и 3) стоимость программиста. Они не являются взаимоисключающими, иногда мы отменяем размер для скорости и, конечно, те, кто способен это сделать (великие программисты) стоят дороже, чем новички.

Также помните, что быстрее всего на компьютере X может быть медленнее на компьютере B. Это операционная система с 16-разрядной, 32-разрядной, 64-разрядной и т.д.? Во многих случаях мы хотим, чтобы переменная была выровнена на границах слов для скорости, так что использование переменных, меньших, чем слово, не позволяет сохранить какое-либо пространство.

Таким образом, нет необходимости использовать наименьшую возможную переменную, но всегда лучше всего сделать осознанный выбор в отношении наилучшего типа.

Ответ 4

В наши дни память дешевая, так как вам не о чем беспокоиться, вы можете сосредоточиться на более важных деталях программирования. Думайте об этом, как о том, как управлять памятью, тем меньше вы должны делать более продуктивным, чем вы в целом. В конечном счете это связано с уровнем абстракции, если вам не нужно контролировать, как работают все шестерни и колеса, тогда лучше не переделывать их.

На практике вы обычно будете использовать либо ints, либо longs (если вам нужен дополнительный размер). В наши дни я бы не занимался чем-то меньшим, если бы не оптимизировал. И помните золотое правило оптимизации Не оптимизируйте, если вам не нужно. Сначала напишите свой код, затем при необходимости оптимизируйте.

Другая аналогичная ситуация - при разработке схемы базы данных. Я часто вижу, что люди проектируют схему, позволяя только то, что нужно для столбцов NVARCHAR. Для меня это смешно, потому что это столбец переменной длины, поэтому вы не теряете пространство, и, предоставляя себе достаточно места, вы избегаете проблем в будущем. Однажды я работал в компании, у которой была внутренняя регистрация на веб-сайте; как только я обновился до IE8, сайт начнет рушиться. После некоторого расследования я обнаружил, что схема протоколирования допускает только 32 символа для строки идентификатора браузера, но при использовании IE8 (с помощью Vis Studio и других расширений) строка идентификатора браузера выросла до 32 и вызвала проблему, которая помешала сайту работать вообще, Разумеется, может потребоваться более строгая проверка длины и лучшая обработка ошибок со стороны разработчика, отвечающего за это, но, допустив 256 вместо 32, не только предотвратит крах, но мы не будем обрезать данные в db.

Я не предлагаю использовать строки и Int64 для всех ваших типов данных (не более, чем я предлагаю вам установить все ваши столбцы sql в NVARCHAR (4000)), потому что вы теряете читаемость. Но выберите подходящий тип и дайте себе много дополнений.

Ответ 5

Локальные переменные, такие как индексы цикла, дешевы. Сколько кадров вы собираетесь иметь в стеке за раз? 50? Сотня? Тысяча? Что за счет использования тысяч счетчиков int вместо тысяч счетчиков byte? 3K? Является ли сохранение 3K стоимостью доработки, когда выясняется, что для нескольких этих массивов требуется более 255 элементов?

Если вы выделяете десятки миллионов этих вещей, то сжатие счетчика бит может иметь смысл. Для локальных жителей это ложная экономия.

Другим фактором является то, что тип сообщает вашим читателям. К лучшему или к худшему люди очень мало интерпретируют на int; но когда они видят a byte, они будут интерпретировать его как нечто конкретно ориентированное на байт, такое как двоичные данные, выходящие из потока, возможно пиксели, или поток, который должен запускаться через кодер, чтобы превратить его в строка. Использование байта в качестве счетчика циклов вызовет много читателей вашего кода с их шагом, поскольку они останавливаются и удивляются: "Подождите, почему это байт вместо int?"

Ответ 6

Рассмотрение этой заметки может помочь вам:

Время выполнения оптимизирует производительность 32-битных целых типов (Int32 и UInt32), поэтому используйте эти типы для счетчики и другие часто используемые интегральные переменные. Для плавающих точек операции, Double - наиболее эффективный тип, поскольку эти операции оптимизируются с помощью аппаратного обеспечения.

source: MCTS Self-Paced Training Kit (Экзамен 70-536): Фонд разработки приложений Microsoft®.NET Framework, второй выпуск

Примечание. Я думаю, что это нормально для машин x86, но для x64 я не знаю.