Это в порядке для использования HttpRuntime. Кэш вне приложений ASP.NET?

преобразование long (или любой другой тип данных, представляющий число) в double теряет точность. Это вполне очевидно из-за представления чисел с плавающей запятой.

Это менее очевидно, чем кажется, поскольку точность потерь зависит от значения long. Для значений от -252 до 252 потери точности вообще отсутствуют.

Насколько велика потеря точности, если я конвертирую большее число в двойное? Должен ли я ожидать различий, превышающих +/- X

. Для чисел с величиной выше 252 вы будете испытывать некоторую потерю точности, в зависимости от того, насколько выше 52-битного предела. Если абсолютное значение вашего long соответствует, скажем, 58 бит, тогда величина вашей точности будет 58-52 = 6 бит или +/- 64.

decimal более подходит для этой задачи?

decimal имеет другое представление, чем double, и использует другую базу. Поскольку вы планируете разделить свой номер на «небольшие числа», разные представления будут давать вам разные ошибки при разделении. В частности, double будет лучше обрабатывать деление по степеням двух (2, 4, 8, 16 и т. Д.), Поскольку такое деление может быть выполнено путем вычитания из показателя, не касаясь мантиссы. Точно так же большие decimal s не потеряли бы значительных цифр при делении на десять, сотню и т. Д.

39
задан Jakub Šturc 2 October 2008 в 04:17
поделиться

8 ответов

Я понимаю, что вопрос старый, но в интересах помощи всем, кто найдет это через поиск, стоит отметить, что .net v4 включает новый кэш общего назначения для такого типа сценариев. Он находится в пространстве имен System.Runtime.Caching:

https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx

Статическая ссылка на экземпляр кэша по умолчанию: MemoryCache.Default

27
ответ дан 27 November 2019 в 02:50
поделиться

Кажется, нет ничего в текущих версиях Системы. Сеть. Кэширование. Кэш, которые зависят от времени выполнения HTTP за исключением Insert() метод, который принимает CacheItemUpdateCallback, таким образом, Scott прав по большей части.

Это не препятствует тому, чтобы Microsoft изменила класс в будущем, которое будет более интегрировано с инфраструктурой HTTP.

я записал находящийся в WeakReference легкий кэш в другом ответе.

2
ответ дан Community 23 September 2019 в 18:22
поделиться

Я когда-то использовал его, но это не чувствовало себя хорошо, и IIRC увеличил объем потребляемой памяти вполне существенно. Вместо этого я реализовал свой собственный легкий механизм кэширования, который удивительно легко сделать.

Это использовало класс WeakReference , который позволил кэшу сохранять ссылки на объект, но также и позволяет Сборщику "мусора" исправлять память, если ссылка не использована.

единственной вещью, которую я не имел, был отдельный поток для чистки устаревших объектов в кэше. То, что я действительно делал, - то, если бы кэш имел> x объекты в нем, я прошел бы все кэшируемые элементы и покрыл бы дерном старые объекты прежде, чем добавить новый объект.

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

1
ответ дан Robert Paulson 23 September 2019 в 18:22
поделиться

Не должно быть никакой проблемы с использованием HttpRuntime. Кэш. Это - сложная хеш-таблица в оперативной памяти, которая может быть очень полезной за пределами веб-контекста. Однако, это могло бы быть что-то вроде запаха кода для ссылки на HttpRuntime. Кэш в non-Http связал приложение, таким образом, это может быть хорошая идея обернуть его позади некоторого интерфейса ICache и использования это по мере возможности.

5
ответ дан Doron Yaacoby 23 September 2019 в 18:22
поделиться

Одна вещь иметь в виду состоит в том, что Microsoft имеет выпущенный Клиентский Установочный пакет Профиля Платформы.NET. Это - версия 3,5 платформ, которые предназначены для клиентских приложений и имеют уменьшенное место. Клиентский Профиль не включает части ASP.NET платформы.

, Если Ваше приложение зависит от Системы. Сеть это остановит Вашу способность приложения использовать в своих интересах Клиентский Профиль.

См. Блог Scott Gu для получения дополнительной информации.

4
ответ дан Brownie 23 September 2019 в 18:22
поделиться

Не используйте его, даже если это действительно работает, это может прекратить работать в следующем пакете обновления / версия.

момент Вы делаете что-то на основе внутренних деталей реализации а не контракта (в этом случае, MSDN), можно ожидать попадать в беду в будущем.

1
ответ дан Nir 23 September 2019 в 18:22
поделиться

Почему бы не избегать вопроса полностью и использования Кэширующийся Блок Библиотеки Предприятия ? Вы могли использовать Систему. Сеть. При кэшировании, но Вы, вероятно, не получите поддержку Microsoft, если Вы столкнетесь с проблемами, и Вы повысите брови, таким образом, это не могло бы стоить того.

0
ответ дан Bryant 23 September 2019 в 18:22
поделиться

Если вы ищете общее решение: Это типичная ситуация для подхода внедрения зависимостей. Используя этот подход, вы можете следовать за Скоттом Хансельманом и MSDN!

Вставьте зависимость System.Web, например HttpRuntime.Cache, без ссылки на System.Web в вашей библиотеке.

1
ответ дан 27 November 2019 в 02:50
поделиться
Другие вопросы по тегам:

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