2010-03-16 4 views
14

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

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

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

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

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

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

+3

Определенно не глупо, любопытство помогает построить лучшего программиста. – ChaosPandion

ответ

10

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

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

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

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

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

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

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

+0

Я помню, как кто-то проектировал колонку как «VarChar (11)». Что происходит, когда мы получаем клиента, который нуждается в «VarChar (12)»? – ChaosPandion

9

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

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

3

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

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

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

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

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

2

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

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

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

2

Учитывая это примечание может помочь вам:

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

Источник: MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework Application Development Foundation, Second edition

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