2008-10-28 3 views
3

Мы используем базовый объект со свойствами, такими как версия (datetime, необходимая для NHibernate) и guid (как ключ).Недостатки использования Int64 универсально вместо int (C#)

Он также имеет поле Id (int) с двумя функциями. Во-первых, чтобы связать с устаревшим ключом приложения, если он есть. Во-вторых, как сокращенный код: например, файлы иногда создаются на основе этих, которые выглядели бы уродливыми и длинными, используя наш ключ-ключ. Мой вопрос не в самом деле о плюсах и минусах базовых объектов, но о том, чтобы ввести этот идентификатор в Int64?

Это не повлияет на то, как он хранится в нашей базе данных MS SQL Server. Будет ли это больше затрат в нашем кеше и памяти ?. Неужели это действительно волнует?

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

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

ответ

3

Ну, int64 использует 8 байт памяти, а int использует 4 байта ... однако вы указали на большинство недостатков. Конечно, выполненные вычисления также будут более медленными во многих системах (64-разрядная система, работающая в режиме 64 бит, может выполнять операции на 64-битном так же быстро, как и на 32-битном, но 32-разрядная система должна выполнять дополнительную работу, а это означает добавление двух 64 разрядные номера выполняются двумя 32-битными добавками плюс некоторый дополнительный код - другие математические операции будут одинаково разбиты на 32-битные операции). Однако, если вы не сохраните миллионы этих чисел и не выполняете с ними массу операций, я сомневаюсь, что вы увидите разницу в производительности, хотя и не в процессорном времени, либо в памяти.

1

Переносимость ... хотя C# на самом деле не знает, как lingua franca, если вы собираетесь переносить, так что это может быть спорным для вашей перспективы?

+1

Где будет проблема переносимости? Я не говорю, что их нет, просто путают, где это может быть. Я не могу легко представить себе общую платформу, которая не имеет 64-битного целочисленного типа. –

+0

Я бы сказал, что это не должно быть проблемой, если все платформы реализуют свои типы на основе Common Language Specification. Или я ошибаюсь? – lowglider

+0

Существует больше возможностей переносимости, чем CLR. Ходят слухи, что там есть другие платформы;) –

4

Если ваше приложение работает на 64-битном процессоре, то, вероятно, не так уж много различий.

На 32-битном процессоре 64-битное целое будет более интенсивным с процессором для выполнения вычислений.

Существует также очевидное использование памяти.

2

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

Сколько стоит память, хранящая ваши идентификаторы на данный момент?

+0

Это где-то посередине, мы стараемся сохранять кешированные объекты стройными, конечно же, никаких капель. я добавлю +1 к вашей точке затрат и комментирую ниже об интеграции. все, что вы можете придумать для благотворительности? – dove