У меня есть приложение, в котором я рассчитываю некоторые термодинамические свойства при различных давлениях и температурах. Характер каждого расчета означает, что иногда свойства рассчитываются для одной и той же комбинации (давление и температура) несколько раз.
Например, расчет при заданных давлении и температуре имеет 28 умножений. , 7 делений, квадратный корень, квадрат, показатель степени, 11 сложений и пара вычитаний.
Чтобы попытаться оптимизировать его, я подумал, что смогу вычислить значения в заданная температураДавление комбинацию и сохраните их в словаре. При повторном вызове расчета он проверяет словарь, чтобы узнать, была ли уже рассчитана такая же комбинация давлениятемпературы, и извлекает ее, если она была.
Чтобы проверить производительность, Первоначально я настроил итерацию для выполнения этого расчета примерно 25 000 000 раз без какого-либо словаря, и в среднем за 10 прогонов оно составило около 6,1 с.
Затем я изменил код, включив в него кеширование: Если кеширование включено включен, то результаты вычислений сохраняются в словаре, индексируемом по давлению и температуре (они хранятся в структуре «Условия», которая реализует IEquatable).
Я обнаружил, что с помощью этого кэширование сократило затраченное время примерно вдвое.
Однако я подумал, что это не очень хороший пример из «реального мира»: мы не вычисляем 25 000 000 раз при одних и тех же условиях. Поэтому я модифицировал его, сделав его более реалистичным: я использовал то же общее количество итераций (25 000 000), но использовал 100 различных температур. Что меня удивило, так это то, что это оказало незначительное влияние на разницу во времени: кэширование все равно работало намного быстрее. Затем я изменил его, чтобы использовать 1000 различных температур, и это стало быстрее (но незначительно). Изменение до 10 000 различных температур было примерно на 10% медленнее, но все же намного быстрее, чем отсутствие кэширования. Я выдержал 100 000 различных температур (что нереалистично)
Сценарий
Время
Нет Кэш
6180 мс
Кэш, постоянная температура
3255 мс
Кэшируется, 100 температур
3203 мс
Кэшируется, 1000 температур
3189 мс
Кэшируется, 10 000 температур
3,416 мс
Сохранено в кэше, 100 000 температур
3743 мс
Мне кажется, что в моем конкретном случае кэширование всегда имеет смысл. Однако я ожидаю, что если бы мои расчеты были менее сложными в вычислительном отношении, это могло бы быть не так.
Поэтому я решил это проверить. Я использовал строку 100 000 и пробовал разные наборы вычислений:
Процедура вычислений: умножение двух двойных чисел, 10 умножений на итерацию
< div class="s-table-container">
Сценарий
Время
Нет кэша
1514 мс
Кэшируется, 100 000 температур
3646 мс
Я обнаружил, что умножение, деление, сложение и вычитание выполняются примерно одинаково.
Процедура вычислений: Одно двойное значение в степени другого (Math.Pow()) два двойных, 10 раз за итерацию
Сценарий
Время
< tr>
Нет кэша
7150 мс
Кэшируется, 100 000 температур
3780 ms
Процедура расчета: (Math.Exp (double)), 10 раз за итерацию
Сценарий
Время
Нет кэша< /td>
5535 мс
Кэшируется, 100 000 температур
3766 мс
Процедура расчета: (Math.Sqrt(double)), 10 раз за итерацию
Сценарий
Время
Нет кэша
1378 мс
Кэшируется, 100 000 температур
3673 мс
Для меня это было немного забавным упражнением, но оно заставило меня задуматься, существует ли аналитическое практическое правило относительно того, когда использовать кэширование. или нет.
Я читал различные темы Stack Overflow, посвященные эффективности словарей, и понимаю, что на скорость поиска не сильно влияет размер словаря, что, как правило, подтверждают мои результаты. . Я также читал, что такие функции, как Math.Pow(), довольно медленные, но я не совсем понимаю, как другие операции с плавающей запятой сравниваются с поиском по словарю (и дополнительными накладными расходами на выполнение вычислений, проверки containsKey() и т. д.) ).
Мой анализ в некоторой степени полезен тем, что показывает, что ответ зависит от того, какие операции вы вычисляете и сколько их. Это также указывает на то, сколько раз ваша функция может быть вызвана при каждой комбинации температуры давления. Но в этом нет ничего определенного.
Поэтому я решил спросить: существует ли практическое правило, что-то вроде:
if [Number операций */+-] + [количество операций Pow()] + [количество операций Exp] за цикл < [Y * количество ожидаемых циклов], затем кэш. В противном случае не делайте этого.
Или лучшим решением является простое тестирование каждого раздела моего кода с использованием реальных вычислительных данных?
Подробнее здесь: https://stackoverflow.com/questions/792 ... recalculat
Существует ли практическое правило, когда кэширование вычислений лучше, чем их пересчет? ⇐ C#
Место общения программистов C#
1733132366
Anonymous
У меня есть приложение, в котором я рассчитываю некоторые термодинамические свойства при различных давлениях и температурах. Характер каждого расчета означает, что иногда свойства рассчитываются для одной и той же комбинации (давление и температура) несколько раз.
Например, расчет при заданных давлении и температуре имеет 28 умножений. , 7 делений, квадратный корень, квадрат, показатель степени, 11 сложений и пара вычитаний.
Чтобы попытаться оптимизировать его, я подумал, что смогу вычислить значения в заданная температураДавление комбинацию и сохраните их в словаре. При повторном вызове расчета он проверяет словарь, чтобы узнать, была ли уже рассчитана такая же комбинация давлениятемпературы, и извлекает ее, если она была.
Чтобы проверить производительность, Первоначально я настроил итерацию для выполнения этого расчета примерно 25 000 000 раз без какого-либо словаря, и в среднем за 10 прогонов оно составило около 6,1 с.
Затем я изменил код, включив в него кеширование: Если кеширование включено включен, то результаты вычислений сохраняются в словаре, индексируемом по давлению и температуре (они хранятся в структуре «Условия», которая реализует IEquatable).
Я обнаружил, что с помощью этого кэширование сократило затраченное время примерно вдвое.
Однако я подумал, что это не очень хороший пример из «реального мира»: мы не вычисляем 25 000 000 раз при одних и тех же условиях. Поэтому я модифицировал его, сделав его более реалистичным: я использовал то же общее количество итераций (25 000 000), но использовал 100 различных температур. Что меня удивило, так это то, что это оказало незначительное влияние на разницу во времени: кэширование все равно работало намного быстрее. Затем я изменил его, чтобы использовать 1000 различных температур, и это стало быстрее (но незначительно). Изменение до 10 000 различных температур было примерно на 10% медленнее, но все же намного быстрее, чем отсутствие кэширования. Я выдержал 100 000 различных температур (что нереалистично)
Сценарий
Время
Нет Кэш
6180 мс
Кэш, постоянная температура
3255 мс
Кэшируется, 100 температур
3203 мс
Кэшируется, 1000 температур
3189 мс
Кэшируется, 10 000 температур
3,416 мс
Сохранено в кэше, 100 000 температур
3743 мс
Мне кажется, что в моем конкретном случае кэширование всегда имеет смысл. Однако я ожидаю, что если бы мои расчеты были менее сложными в вычислительном отношении, это могло бы быть не так.
Поэтому я решил это проверить. Я использовал строку 100 000 и пробовал разные наборы вычислений:
[b]Процедура вычислений: умножение двух двойных чисел, 10 умножений на итерацию[/b]
< div class="s-table-container">
Сценарий
Время
Нет кэша
1514 мс
Кэшируется, 100 000 температур
3646 мс
Я обнаружил, что умножение, деление, сложение и вычитание выполняются примерно одинаково.
[b]Процедура вычислений: Одно двойное значение в степени другого (Math.Pow()) два двойных, 10 раз за итерацию[/b]
Сценарий
Время
< tr>
Нет кэша
7150 мс
Кэшируется, 100 000 температур
3780 ms
[b]Процедура расчета: (Math.Exp (double)), 10 раз за итерацию[/b]
Сценарий
Время
Нет кэша< /td>
5535 мс
Кэшируется, 100 000 температур
3766 мс
[b]Процедура расчета: (Math.Sqrt(double)), 10 раз за итерацию[/b]
Сценарий
Время
Нет кэша
1378 мс
Кэшируется, 100 000 температур
3673 мс
Для меня это было немного забавным упражнением, но оно заставило меня задуматься, существует ли аналитическое практическое правило относительно того, когда использовать кэширование. или нет.
Я читал различные темы Stack Overflow, посвященные эффективности словарей, и понимаю, что на скорость поиска не сильно влияет размер словаря, что, как правило, подтверждают мои результаты. . Я также читал, что такие функции, как Math.Pow(), довольно медленные, но я не совсем понимаю, как другие операции с плавающей запятой сравниваются с поиском по словарю (и дополнительными накладными расходами на выполнение вычислений, проверки containsKey() и т. д.) ).
Мой анализ в некоторой степени полезен тем, что показывает, что ответ зависит от того, какие операции вы вычисляете и сколько их. Это также указывает на то, сколько раз ваша функция может быть вызвана при каждой комбинации температуры давления. Но в этом нет ничего определенного.
Поэтому я решил спросить: существует ли практическое правило, что-то вроде:
if [Number операций */+-] + [количество операций Pow()] + [количество операций Exp] за цикл < [Y * количество ожидаемых циклов], затем кэш. В противном случае не делайте этого.
Или лучшим решением является простое тестирование каждого раздела моего кода с использованием реальных вычислительных данных?
Подробнее здесь: [url]https://stackoverflow.com/questions/79242750/is-there-a-rule-of-thumb-for-when-caching-calculations-is-better-than-recalculat[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия