Самый быстрый Uint32 в преобразование int в c#
-
14-10-2019 - |
Вопрос
У меня есть процедура быстрого уровня битов, которая вычисляет значение и возвращает UINT32. Мне нужно сохранить это значение в SQL Server в 32 -битном поле Int. Я не хочу увеличивать размер поля и просто хочу хранить «байты» из этой функции поля Int.
Сотни этих записей запрашиваются за раз, поэтому мне нужен самый быстрый способ преобразования UINT32 в INT в цикле. Если в левой части бит установлен в UINT32, он должен установить знак int (или сделать что-то «повторяемое», на самом деле, но бит знака, вероятно, будет проще).
Другими словами, я просто хочу, чтобы 4 байта UINT32 стали 4 байтами 32 -битного Int. Я мог бы использовать класс BitConverter, но я не уверен, что это самый быстрый способ. Было бы быстрее сделать это с такой неконтролированной областью, как это:
UInt32 fld = 4292515959;
unchecked {
return (int)fld;
// -2451337
}
Я вижу, что обратный вопрос был задан здесь, и мне было просто интересно, будет ли ответ таким же, идущий в другую сторону:
Решение
Я бы сказал, что неконтролированная версия (например unchecked((int)x)
) это самый быстрый способ, так как нет метода вызова. Я не верю, что есть быстрее.
Кстати, UInt32
это просто другое имя для uint
... идти в одну сторону - это то же самое, что и другой путь с точки зрения производительности, так что это действительно то же самое, что и ссылка, которую вы разместили.
РЕДАКТИРОВАТЬ: Я помню, как смотрел из первых рук экземпляр теста, где checked
был Быстрее чем unchecked
(И нет, это была не отладочная сборка, это была сборка релиза с оптимизацией). Я не знаю, почему это произошло, но в любом случае, не думайте, что вы получите что -то измеримое, поворачиваясь на проверке переполнения.
Другие советы
unchecked((int)x)
требуется только константы литья и проверенные и неконтролируемые дает те же результаты (если код может компилироваться).
Например, этот код
uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
uncheckedData = (int)data;
}
checkedData = (int)data;
Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);
производит этот выход
4292515959 -2451337 -2451337
Чтобы быть более кратким, этот код может быть составлен (тот же результат, что и unchecked((int)data)
)
uint data = 4292515959;
checkedData = (int)data;
Этот код (обратите внимание на констант) не может быть скомпилирован (требует неконтролируемого)
const uint data = 4292515959;
checkedData = (int)data;
Этот код также не может быть составлен (требует неконтролируемого)
checkedData = (int)4292515959;