Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408

Быстродействие double, decimal в x64

19.01.2016, 11:48. Показов 9859. Ответов 106

Студворк — интернет-сервис помощи студентам
Работаю с финансовыми данными, максимальное количество знаков после запятой - 4.
Получаю данные по DDE в формате object[][]. Тип объекта может быть string или double.

Возникли следующие вопросы:
1. Арифметика double крутиться в регистрах процессора на x64, коли double 8 бит?
2. Раз уж приложение работает с финансами, и, вроде как, желательно использовать decimal,
могу ли я без значительных издержек (погрешность допускается) обойтись double в угоду быстродействия?
3. Если все-таки, захочу работать с double, применение Math.Round не отнимет полученного выигрыша в производительности?
4. Как правильно задать конфигурацию решения x64?
5. Как из object, тип которого заранее известен (double), быстрее получить значение? Распаковка (double)obj?
6. Допустим, имеется класс, с полем double и в DGV отображается BindingList<SomeClass>,
как заставить отображаться этот double с определенным количеством цифр после зпт? (вопрос не особо важен).

7. Какие есть способы быстро работать с decimal и конвертировать из double в decimal?
8. Ну, а так же интересуют комментарии в целом, по поводу быстродействия в данных условиях.

Добавлено через 16 часов 54 минуты
Сокращаю перечень вопросов до 1, 4, 8
С миру по нитке хоть собрать бы. Есть мнения хотя бы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2016, 11:48
Ответы с готовыми решениями:

Быстродействие одинаковых программ x86 или x64
Добрый день! Если не брать ограничение в используемой оперативной памяти для x86, кто-нибудь замерял реальную разницу в...

Какой тип использовать для денежных коэффициентов (например процент скидки)? Decimal или Double?
Добрый день, возник вопрос, какой тип данных следует использовать для коэффициентов, связанных с денежными расчётами? Сами деньги,...

Чем отличается decimal от double?
Double это все числа с плавающей точкой, тоесть у decimal тоже есть плавающая точка, а значит decimal тоже double. Чтото тут не так...?

106
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.01.2016, 17:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Работаю с финансовыми данными, максимальное количество знаков после запятой - 4
Да, кстати, при форматировании строки для вывода на печать есть формат "C" - денежная единица, вот только в нашей стране по умолчанию там 2 знака после запятой и ставится символ официальной валюты. Меняется (на всякий случай), в настройках ОС.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.01.2016, 17:21  [ТС]
Psilon, небольшой вопрос в догонку, правильно ли я понимаю, что

C#
1
2
3
4
5
6
struct Row{
 
string Name;
double Value;
//....
}
будет явно быстрее

C#
1
2
3
4
5
6
class Row{
 
string Name;
decimal Value;
//....
}
в совокупности, с тем, что обсуждалось выше?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.01.2016, 17:24
Цитата Сообщение от Psilon Посмотреть сообщение
С другой стороны если уж уже приходи в double и предполагается, что на точность можно подзабить, то и decimal можно не использовать.
Я вполне допускаю вариант, что библиотеку писали люди, не знающие о правиле decimal для денег, и считающие, что самый точный тип - это Double (я когда учился в далёком 2002 нам так и говорили). Я, если честно, не доверял бы людям возвращающим неопределённый тип данных. Кто их знает что ещё они могут в object засунуть в какой-нибудь нестандартной ситуации.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.01.2016, 17:31  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
возвращающим неопределённый тип данных
Цитата Сообщение от aquaMakc Посмотреть сообщение
не доверял бы людям возвращающим неопределённый тип данных
Что придет, - решаю я, и это будет число или строка, object[][] нужен для того, чтобы смешать разные типы данных в одну таблицу.
Второй раз себя процитирую
Цитата Сообщение от Woldemar89 Посмотреть сообщение
я заранее знаю, что лежит в object - string или double, просто они вперемешку идут в object[][].
А по поводу double или decimal, с незначительной допустимой погрешностью, хорошо выразился
Цитата Сообщение от Psilon Посмотреть сообщение
С другой стороны если уж уже приходи в double и предполагается, что на точность можно подзабить, то и decimal можно не использовать.
подтвердив мои мысли.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.01.2016, 17:38
) немного поигравшись с культурами родился такой минимонстр:
C#
1
2
decimal d = 11.99m;
Console.WriteLine(d.ToString("C3", System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures).Where(p => p.Name == "en").FirstOrDefault()));
C3 - денежный формат, 3 знака после запятой, потом из списка всех доступных культур линком выбираю en - английский формат. Странно только то, что знак доллар, возможно where возвращает несколько форматов, но разбираться как-то уже лениво.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.01.2016, 17:43  [ТС]
aquaMakc, спасибо, я с этим чуть позже поразбираюсь, пока актуален вопрос о struct и class.
Быстродействие double, decimal в x64
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2016, 17:43
aquaMakc, взял английскую культуру - получил доллар, что нелогичного-то?

Woldemar89, откуда ты получаешь-то? Если из управляемого кода, то нужно дженерики писать, если нет - то можно смотреть в сторону byte[].

Цитата Сообщение от Woldemar89 Посмотреть сообщение
небольшой вопрос в догонку, правильно ли я понимаю, что
Быстрее, но вряд ли ты заметишь С тем же успехом 1.0 + 1.0 считается быстрее, чем double.Epsilon + double.Epsilon (см. денормализованные числа). Но ты ведь этого не учитываешь
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.01.2016, 17:46  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
откуда ты получаешь-то?
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Получаю данные по DDE
Библиотека NDDE, FTFHelper с помощью XLTable.Cells парсит полученный byte[] Data в object[][].

Цитата Сообщение от Psilon Посмотреть сообщение
Быстрее, но вряд ли ты заметишь
После таких фраз авторитетных людей, начинаю сомневаться, что оптимизация вообще нужна
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.01.2016, 18:07

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
взял английскую культуру - получил доллар, что нелогичного-то?
ну как-бы в англии денежная единица - фунт )



Добавлено через 3 минуты
Цитата Сообщение от Woldemar89 Посмотреть сообщение
спасибо, я с этим чуть позже поразбираюсь, пока актуален вопрос о struct и class.
теоретически работа со структурами быстрее, практически - хз, попробуй поэкспериментировать с замером времени исполнения на паре тысяч объектов-болванок.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2016, 18:50
Цитата Сообщение от aquaMakc Посмотреть сообщение
ну как-бы в англии денежная единица - фунт )
Ну так ты ж не для англии написал:
Миниатюры
Быстродействие double, decimal в x64  
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2016, 19:03
Woldemar89, структуры всегда должны быть неизменяемыми. Алсо свойства стоит делать вместо полей, ибо бывают разные приколы. Из старого наболевшего: в WPF не будет работать биндинг, если указано поле, а не свойство. Ну и в принципе с точки зрения производительности get; private set; лучше. Во-вторых ты занимаешься оптимизациями до непосредственных замеров, это плохо. Нужно писать грамотно, как правильно по архитектуре, а затем оптимизировать проблемные места, ибо известно, что оптимизация и красота кода как правило противопоставлены.

С точки зрения же архитектуры в таком случае нужно понять, что тебе нужно - семантика перемещения или копирования. Если перемещения, то нужно делать класс, если копирования - то структуру. Класс и структура в первую очередь должны выбираться именно на основании необходимой семантики взаимодействия с ними.

Такие дела.

Но стоит начать с другой статьи (он в первом предложении на неё ссылается).

Добавлено через 6 минут
I find this characterization of a value type based on its implementation details rather than its observable characteristics to be both confusing and unfortunate. Surely the most relevant fact about value types is not the implementation detail of how they are allocated, but rather the by-design semantic meaning of “value type”, namely that they are always copied “by value”. If the relevant thing was their allocation details then we’d have called them “heap types” and “stack types”. But that’s not relevant most of the time. Most of the time the relevant thing is their copying and identity semantics.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.01.2016, 19:11  [ТС]
Psilon, спасибо, буду переваривать

Добавлено через 2 минуты
И вообще, в голову пришла мысля, если уж оптимизировать, - то писать в Native.
Может, и правда, дурью маюсь, но, в любом случае, знание не повредит.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.01.2016, 00:32
Woldemar89, есть хороший парень - Андрей Акиньшин (он кстати замутил тему с тестами на форуме, но я с ним в реале встречался на конфах, он MVP). Так вот, он меня полностью пролечил от "напиши на С++ - сделай код быстрым"
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
20.01.2016, 00:46  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
он кстати замутил тему с тестами на форуме
Ага, к курсе.
Цитата Сообщение от Psilon Посмотреть сообщение
полностью пролечил
Пролечил, в смысле вылечил? То есть, если руки из нужного места растут, C# тащит?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.01.2016, 10:36
Woldemar89, грубо говоря да. Есть нюансы офк, но я вот например когда писал свою библиотечку (я её уже сломал, нужно будет переписывать ), писал её на шарпе, при этом предусматривал оптимизацию выполнения в разных хардварных потоках (это когда процессор видит две независимых инструкции и выполняет их одновременно). В результате добавив еще и многопоточность получил прирост в ~10 раз относительно LINQ с тем же результатом
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
20.01.2016, 11:02  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
писал её на шарпе, при этом предусматривал оптимизацию выполнения в разных хардварных потоках (это когда процессор видит две независимых инструкции и выполняет их одновременно).
Интересно, как это в шарпе выглядит, да и вообще.
Цитата Сообщение от Psilon Посмотреть сообщение
относительно LINQ
В плане быстродействия в PLINQ, я чет совсем разочаровался, но пользуюсь ради удобства, уж сильно нравится в этом плане.
Может применять не умею, руки пока еще у меня не совсем из плечей растут, но, ползут вверх потихоньку
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.01.2016, 11:17
Woldemar89, ну в данном случае я про Min, Max и все прочее без параметров. Производительность всяких других методов ограничена тем, что мы делаем. Когда вызов лямбды это половина затраченного времени, ибо там выражение x*x, то это не вина LINQ

Добавлено через 53 секунды
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Интересно, как это в шарпе выглядит, да и вообще.
Просто я подстраиваю код под паттерны компиляторных оптимизаций Выглядит немного страшно, зато работает быстро. Когда перепишу - покажу, пожалуй
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
20.01.2016, 11:22  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
то это не вина LINQ
Кстати да, интуиция мне это подсказывала, но я чет не прислушался.

Цитата Сообщение от Psilon Посмотреть сообщение
Просто я подстраиваю код под паттерны компиляторных оптимизаций Выглядит немного страшно
Кто бы сомневался Особенно для моего уровня и ниже.

Я кстати чуть попереварил насчет классов и структур, спасибо за инфу, хранить в
C#
1
2
3
4
5
6
struct Row{
 
string Name;
double Value;
//....
}
Для меня вполне приемлемо, поэтому - почему бы нет, буду пилить.

И можно будет помучаться в размером и выравниванием структур
Знаю, что бредовое желание, но интересно чет
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.01.2016, 11:53
Woldemar89, да ничего сложного на самом деле. Например нужно понимать, почему если мы итерируемся в цикле от 0 до 10000 элементов массива он посчитает быстрее, чем от 0 до 9999 Причем зачастую только на х64-компиляторе. Или почему нужно сначала класть результат вычислений в локальную переменную, а только потом её возвращать (даже если красивее просто вернуть результат). И т.п. Тут чисто эвристика и знание нюансов компилятора, ни больше ни меньше. Никакого rocket science тут нет и в помине, скорее даже наоборот

Но мое мнение в том, что пишешь один раз - пользуешься везде и знаешь, что оно быстрое и хорошее А какие там goto под капотом, не суть важно. Если код write-once, которому не нужна поддержка - то это самое оно. Мб потом еще добавлю поддержку SIMD Тогда будет вообще красота. Если будет возможность в рантайме проверить, есть ли SIMD.
1
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
20.01.2016, 12:40
Цитата Сообщение от Woldemar89 Посмотреть сообщение
2. Раз уж приложение работает с финансами, и, вроде как, желательно использовать decimal,
могу ли я без значительных издержек (погрешность допускается) обойтись double в угоду быстродействия?
Нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2016, 12:40

Как преобразовать Double в Decimal?
Все очень просто Convert.ToDouble(value)

Обрезать значение (усечь) decimal/double
Обрезать значение(усечь)decimal/double Привет всем, подскажите как правильно обрезать вывод операции до, к примеру, 10 знаков. ...

Аргумент 1 не удается преобразовать из double? в decimal
Не могу понять почему это происходит и как решить.Пишет аргумент 1 не удается преобразовать из double? в decimal.Подскажите как правильно...

Cannot implicitly convert type 'double' to 'decimal'
Доброго времени суток, помогите плиз. Сделал переменные duble: double cRe = -0.70176, cIm = -0.3842; Дальше сделал...

MaskedTextBox: ввод только Decimal или Double
Как сделать так чтоб можно было вводить только данные типа desimal, ну или Double?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru