Почему я должен использовать int вместо Byte или short в C#
Я нашел несколько потоков в отношении этой проблемы. Большинство людей, похоже, предпочитают использовать int в своем коде c#, даже если байт или smallint будут обрабатывать данные, если это не мобильное приложение. Я не понимаю, почему. Разве не имеет смысла определить ваш тип данных C# как тот же тип данных, который был бы в вашем решении для хранения данных?
Моя Посылка:
Если я использую типизированный набор данных, классы Linq2SQL, POCO, так или иначе я столкнусь с компилятором datatype проблемы с преобразованием, если я не синхронизирую свои типы данных на разных уровнях. Мне не очень нравится делать систему.Конвертировать все время только потому, что было проще использовать int через доску в коде c#. Я всегда использовал любой самый маленький тип данных, необходимый для обработки данных в базе данных, а также в коде, чтобы мой интерфейс к базе данных был чистым. Поэтому я бы поставил 75% моего кода C# использует byte или short в отличие от int, потому что это то, что находится в базе данных.
возможности:
Означает ли это, что большинство людей, которые просто используют int для всего в коде, также используют тип данных int для своих типов данных хранилища sql и могут меньше заботиться об общем размере своей базы данных или они делают систему.преобразование в коде, где это применимо?
Почему я забочусь: я всегда работал сам по себе, и я просто хочу быть знакомым с лучшими практиками и стандартными соглашениями о кодировании.
7 ответов:
с точки зрения производительности, int быстрее почти во всех случаях. Процессор предназначен для эффективной работы с 32-разрядными значениями.
более короткие значения сложны в обращении. Чтобы прочитать один байт, скажем, процессор должен прочитать 32-разрядный блок, который его содержит, а затем замаскировать верхние 24 бита.
чтобы записать байт, он должен прочитать целевой 32-битный блок, перезаписать нижние 8 бит с требуемым значением байта и записать весь 32-битный блок обратно снова.
с точки зрения пространства, конечно, вы сохраняете несколько байтов, используя меньшие типы данных. Поэтому, если вы создаете таблицу с несколькими миллионами строк, то более короткие типы данных могут быть рассмотрены. (И то же самое может быть хорошей причиной, почему вы должны использовать меньшие типы данных в своей базе данных)
и правильно, int не переполняется легко. Что делать, если вы думаю ваше значение будет вписываться в байт, а затем в какой-то момент в будущем какой-то безобидный вид изменение кода означает, что в нем сохраняются большие значения?
вот некоторые из причин, почему int должен быть вашим типом данных по умолчанию для всех интегральных данных. Используйте byte только в том случае, если вы действительно хотите хранить машинные байты. Используйте shorts только в том случае, если вы имеете дело с форматом файла или протоколом или аналогичным, который фактически определяет 16-разрядные целочисленные значения. Если вы просто имеете дело с целыми числами в целом, сделайте их ints.
Я только 6 лет поздно, но, возможно, я могу помочь кому-то еще.
вот некоторые рекомендации, которые я бы использовал:
- если есть возможность, что данные не будут соответствовать в будущем, то используйте более крупный тип int.
- если переменная используется в качестве поля структуры/класса, то по умолчанию она будет дополнена, чтобы занять все 32-битные в любом случае, поэтому использование byte/int16 не сохранит память.
- если переменная недолговечна тогда (как внутри функции), то меньшие типы данных, не поможет.
- "byte" или "char" иногда могут лучше описывать данные и могут выполнять проверку времени компиляции, чтобы убедиться, что ему не назначены большие значения при аварии. например, если сохранить день месяца (1-31) с помощью байта и попытаться присвоить ему 1000, то это вызовет ошибку.
- если переменная используется в массиве примерно 100 или более я бы использовал меньший тип данных, пока это имеет смысл.
- байт и int16 массивы не так потокобезопасны, как int (примитив).
одна тема, которую никто не поднял, - это ограниченный кэш процессора. Меньшие программы выполняются быстрее, чем большие, потому что процессор может вместить больше программы в более быстрые Кеши L1/L2/L3.
использование типа int может привести к меньшему количеству инструкций ЦП, однако это также заставит более высокий процент памяти данных не помещаться в кэш ЦП. Инструкции дешевы для выполнения. Современные ядра процессора могут выполнять 3-7 инструкций за такт, однако, одного кэша с другой стороны может стоить 1000-2000 тактов, потому что он должен идти на таран.
при сохранении памяти это также приводит к тому, что остальная часть приложения работает лучше, потому что она не выдавливается из кэша.
Я сделал быстрый тест суммы с доступом к случайным данным в случайном порядке, используя как массив байтов, так и массив int.
const int SIZE = 10000000, LOOPS = 80000; byte[] array = Enumerable.Repeat(0, SIZE).Select(i => (byte)r.Next(10)).ToArray(); int[] visitOrder = Enumerable.Repeat(0, LOOPS).Select(i => r.Next(SIZE)).ToArray(); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); int sum = 0; foreach (int v in visitOrder) sum += array[v]; sw.Stop();вот результаты по времени (тики): (x86, режим выпуска, без отладчика, .NET 4.5, I7-3930k) (чем меньше, тем лучше)
________________ Array Size __________________ 10 100 1K 10K 100K 1M 10M byte: 549 559 552 552 568 632 3041 int : 549 566 552 562 590 1803 4206
- доступ к элементам 1M случайным образом, используя байт на моем процессоре, увеличил производительность на 285%!
- что-нибудь под 10,000 было едва заметно.
- int никогда не был быстрее, чем байт для этого базового теста суммы.
- эти значения будут очень разными процессорами с разными размерами кэша.
одно последнее замечание, иногда я смотрю на теперь открытый исходный код .NET рамки, чтобы увидеть, что делают эксперты Microsoft. Платформа .NET framework использует byte/int16 на удивление мало. Я не мог найти любой.
вам придется иметь дело с несколькими миллиардами строк, прежде чем это будет иметь какое-либо существенное значение с точки зрения емкости хранилища. Допустим, у вас есть три столбца, и вместо использования эквивалентного байту типа базы данных вы используете int-эквивалент.
Это дает нам 3 (столбцы) х 3 (байты дополнительно) в строке, или 9 байт в строке.
Это означает, что для "нескольких миллионов строк" (скажем, три миллиона) вы потребляете целых дополнительных 27 мегабайт дискового пространства! К счастью, как мы больше не живем в 1970-х годах, вы не должны беспокоиться об этом :)
Как было сказано выше, остановите микрооптимизацию-снижение производительности при преобразовании в / из разных целочисленных числовых типов ударит вас намного, намного сложнее, чем затраты на пропускную способность/дисковое пространство, если вы не имеете дело с очень, очень, очень большими наборами данных.
по большей части "нет".
Если вы не знаете заранее, что вы собираетесь иметь дело с 100 из миллионов строк, это микро-оптимизация.
делайте то, что лучше всего подходит для модели домена. Позже, если у вас есть проблемы с производительностью, тест и профиль, чтобы точно определить, где они происходят.
Не то, чтобы я не верил Джону Гранту и другим, но я должен был увидеть сам с нашей "таблицей миллионов строк". Таблица 1,018,000. Я сконвертировал 11 тип tinyint колонны и 6 колонны типа smallint в тип int, там уже были 5 инт & 3 smalldatetimes. 4 разных индекса использовали комбинацию различных типов данных, но очевидно, что все новые индексы теперь используют столбцы int.
внесение изменений стоило мне только 40 Мб вычисление использования диска базовой таблицы без индексов. Когда я добавил индексы обратно в общее изменение было только 30 Мб разница в целом. Поэтому я был удивлен, потому что я думал, что размер индекса будет больше.
Так что 30 Мб стоит хлопот с использованием всех различных типов данных, ни в коем случае! Я отправляюсь в INT land, спасибо всем за то, что этот анальный сдержанный программист вернулся к прямой и счастливой блаженной жизни без каких-либо целочисленных преобразований...ура!
Если int используется везде, никаких приведений или преобразований не требуется. Это больший удар для доллара, чем память, которую вы сохраните, используя несколько целых размеров.
Он просто делает жизнь проще.
среда выполнения .NET оптимизирована для Int32. См. предыдущие обсуждения на .Чистая числом против типа INT16?
Comments