С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Woldemar89
TheGreatCornholio
1210 / 691 / 280
Регистрация: 30.07.2015
Сообщений: 2,363
Завершенные тесты: 1
1

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

19.01.2016, 11:48. Просмотров 3034. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2016, 11:48
Ответы с готовыми решениями:

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

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

Страшный и ужасный decimal
Многоуважаемый Ол (All). Подскажите пожалуйста что это за чо? &gt; var d1 =...

Math.Pow для decimal?
Возникла проблема: необходимо извлечь 128-битный корень n-ной степени, но...

Linq максимальное число decimal из таблицы
Имеется 2 таблицы. Продавец и продажи. нужно найти максимальную продажу для...

106
aquaMakc
473 / 386 / 68
Регистрация: 14.02.2014
Сообщений: 1,883
Завершенные тесты: 1
19.01.2016, 17:17 21
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Работаю с финансовыми данными, максимальное количество знаков после запятой - 4
Да, кстати, при форматировании строки для вывода на печать есть формат "C" - денежная единица, вот только в нашей стране по умолчанию там 2 знака после запятой и ставится символ официальной валюты. Меняется (на всякий случай), в настройках ОС.
1
Woldemar89
TheGreatCornholio
1210 / 691 / 280
Регистрация: 30.07.2015
Сообщений: 2,363
Завершенные тесты: 1
19.01.2016, 17:21  [ТС] 22
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
aquaMakc
473 / 386 / 68
Регистрация: 14.02.2014
Сообщений: 1,883
Завершенные тесты: 1
19.01.2016, 17:24 23
Цитата Сообщение от Psilon Посмотреть сообщение
С другой стороны если уж уже приходи в double и предполагается, что на точность можно подзабить, то и decimal можно не использовать.
Я вполне допускаю вариант, что библиотеку писали люди, не знающие о правиле decimal для денег, и считающие, что самый точный тип - это Double (я когда учился в далёком 2002 нам так и говорили). Я, если честно, не доверял бы людям возвращающим неопределённый тип данных. Кто их знает что ещё они могут в object засунуть в какой-нибудь нестандартной ситуации.
1
Woldemar89
TheGreatCornholio
1210 / 691 / 280
Регистрация: 30.07.2015
Сообщений: 2,363
Завершенные тесты: 1
19.01.2016, 17:31  [ТС] 24
Цитата Сообщение от aquaMakc Посмотреть сообщение
возвращающим неопределённый тип данных
Цитата Сообщение от aquaMakc Посмотреть сообщение
не доверял бы людям возвращающим неопределённый тип данных
Что придет, - решаю я, и это будет число или строка, object[][] нужен для того, чтобы смешать разные типы данных в одну таблицу.
Второй раз себя процитирую
Цитата Сообщение от Woldemar89 Посмотреть сообщение
я заранее знаю, что лежит в object - string или double, просто они вперемешку идут в object[][].
А по поводу double или decimal, с незначительной допустимой погрешностью, хорошо выразился
Цитата Сообщение от Psilon Посмотреть сообщение
С другой стороны если уж уже приходи в double и предполагается, что на точность можно подзабить, то и decimal можно не использовать.
подтвердив мои мысли.
0
aquaMakc
473 / 386 / 68
Регистрация: 14.02.2014
Сообщений: 1,883
Завершенные тесты: 1
19.01.2016, 17:38 25
) немного поигравшись с культурами родился такой минимонстр:
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
Woldemar89
TheGreatCornholio
1210 / 691 / 280
Регистрация: 30.07.2015
Сообщений: 2,363
Завершенные тесты: 1
19.01.2016, 17:43  [ТС] 26
aquaMakc, спасибо, я с этим чуть позже поразбираюсь, пока актуален вопрос о struct и class.
Быстродействие double, decimal в x64
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2016, 17:43 27
aquaMakc, взял английскую культуру - получил доллар, что нелогичного-то?

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

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

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

Не по теме:

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



Добавлено через 3 минуты
Цитата Сообщение от Woldemar89 Посмотреть сообщение
спасибо, я с этим чуть позже поразбираюсь, пока актуален вопрос о struct и class.
теоретически работа со структурами быстрее, практически - хз, попробуй поэкспериментировать с замером времени исполнения на паре тысяч объектов-болванок.
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2016, 18:50 30
Цитата Сообщение от aquaMakc Посмотреть сообщение
ну как-бы в англии денежная единица - фунт )
Ну так ты ж не для англии написал:
0
Миниатюры
Быстродействие double, decimal в x64  
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2016, 19:03 31
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
Woldemar89
TheGreatCornholio
1210 / 691 / 280
Регистрация: 30.07.2015
Сообщений: 2,363
Завершенные тесты: 1
19.01.2016, 19:11  [ТС] 32
Psilon, спасибо, буду переваривать

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

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

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

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

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

Но мое мнение в том, что пишешь один раз - пользуешься везде и знаешь, что оно быстрое и хорошее А какие там goto под капотом, не суть важно. Если код write-once, которому не нужна поддержка - то это самое оно. Мб потом еще добавлю поддержку SIMD Тогда будет вообще красота. Если будет возможность в рантайме проверить, есть ли SIMD.
1
Shamil1
Модератор
2173 / 1469 / 336
Регистрация: 26.03.2015
Сообщений: 5,306
20.01.2016, 12:40 40
Цитата Сообщение от Woldemar89 Посмотреть сообщение
2. Раз уж приложение работает с финансами, и, вроде как, желательно использовать decimal,
могу ли я без значительных издержек (погрешность допускается) обойтись double в угоду быстродействия?
Нет.
0
20.01.2016, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2016, 12:40

Быстродействие вычислительных операций C# и С++
Всем здравствуйте. Есть тройной цикл, выполняющий некие вычисления: ...

Быстродействие управляемого и неуправляемого кода
начал изучать небезопасный код,написал прогу в ней 2 функции одна с управляемым...

Обфускация кода в SmartAssembly снижает быстродействие
Я заметил, что обфускация кода в SmartAssembly значительно роняет...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru