Вопрос по .net, c# – производительность байт против int в .NET

10

В мире, предшествующем .NET, я всегда предполагал, что int быстрее байта, поскольку так работает процессор.

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

Вопрос: Как .NET обрабатывает тип байта по сравнению с int с точки зрения производительности / памяти.

Обновить: Спасибо за вклад. К сожалению, никто не ответил на этот вопрос. Как .NET обрабатывает байт против int.

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

Ваш Ответ

5   ответов
7

Вы говорите о памяти или операциях с байтом? Если это место для хранения, то да, оно занимает меньше места, чем int (1 байт против 4 байт).

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

byte b1 = 4;
byte b2 = 6;
byte b3 = b1 + b2;  // Does not compile because the type is int

Так что в общем случае я думаю, что можно с уверенностью сказать, что арифметические операции над int выполняются быстрее, чем операции над байтом. Просто потому, что в байтовом случае вы оплачиваете (возможно, очень небольшую) стоимость продвижения типа.

2

ОК, я только что открыл окно разборки. Там нет ничего, кроме обычного "mov byte"

Таким образом, .NET / CLR ничего не добавляет к этому. И все арифметические операции выполняются со значениями типа int, поэтому никакой разницы между байтами и int нет.

2

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

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

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

0

То же, что и любая другая платформа. Почему .NET изменил бы это? Код все еще должен работать на том же процессоре, который имеет те же характеристики производительности, что и всегда.

А это значит, что вы должныstill использованиеint по умолчанию.

12

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

Будь то в .NET или нативном коде, вначале сосредоточьтесь на том, чтобы использовать данные как семантически правильные для вашего приложения, а не пытаться двояко угадать архитектуру компьютерной системы - "преждевременная оптимизация - корень всех зол в программировании", чтобы цитата Кнут, цитируя Хоара.

Если int (32) работает медленнее на 64-битной машине, тогда byte & amp; будет ли точно такая же производительность на 64 машинах? (но байт будет лучше для хранения массива в этом случае?)
Так что, если я использую int (32-битную), то она будет работать медленнее, чем __int64 на 64-битной машине (как на Android, так и на ПК)?
Цитата отличная, уловка "преждевременная". Хотя я согласен с тем, что байт необязательно буквально переводится в чтение байта или использование регистра процессора ограниченным образом. Разве это не «маскировка»? приходит с ценой? Maxim Alexeyev
@ Максим, конечно, это "идет с ценой" - один тыdon't know whether you're payingС тех пор, как IBM представила концепцию архитектуры (которую видит программист на машинном языке) как полностью отличающуюся от реального оборудования, с серией IBM 360 почти 50 лет назад. Если вы пишете код для какой-либо наполовину популярной архитектуры (x86 - худший вариант для этого, так как он имеет наибольшие и самые разные реализации), выjust can't know насколько дорогое чтение 1 байта против 1 полного слова. Так что даже не беспокойтесь об этом, а вместо этого используйте простой, простой код.

Похожие вопросы