Форум программистов, компьютерный форум, киберфорум
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. Показов 9046. Ответов 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
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.01.2016, 15:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Shamil1 Посмотреть сообщение
джит - это НЕ компилятор, джит - это конкретный алгоритм выбора момента компиляции
Я знаю пару людей, которые вместо общепринятой терминологии используют свою собственную Так что меня этим не проймешь: я говорю на языке, который понимает > 1 человека.

Когда говорят про .Net, различают 2 компилятора: csc.exe, который фактически ничего не делает, тупо транслируя 1:1 C# в IL, не выполняя никаких оптимизаций, а и JIT-компилятор (в простонародье просто джит), который уже занимается оптимизациями (насколько позволяют временные рамки), превращает уже в инструкции целевой машины код и т.п.

Так вот, еще не существует JIT-компилятора IL-кода, который по оптимизациям сделает gcc/icc/msvscc/llvm/... Да и невозможно физически за такой ограниченный промежуток времени сделать правильные выводы из окружения.
2
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
21.01.2016, 17:08
Цитата Сообщение от Psilon Посмотреть сообщение
Когда говорят про .Net, различают 2 компилятора: csc.exe, который фактически ничего не делает, тупо транслируя 1:1 C# в IL, не выполняя никаких оптимизаций
странно у меня почему то это код
C#
1
2
3
4
public static int Main(string[] args)
{
    return 5 * 5;
}
транслируется в
C#
1
2
3
4
public static int Main(string[] args)
{
    return 25;
}
Интересно а зачем вообще есть опция оптимизировать ?
Интересно то что к .net относится еще несколько языков, например F# который транслирует
C#
1
2
3
4
5
6
static int foo() => 5;
 
public static int Main(string[] args) 
{
    return 5 * foo();
}
в
C#
1
2
3
4
public static int Main(string[] args) 
{
    return 25;
}
Чего почему то не может сделать csc.exe.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.01.2016, 19:21
maxillion, давно уже исследовал оптимизации процессорные.
Вот, можно всю тему почитать в принципе, даю прямую ссылку на то, как С оптимизирует (плюсы в этом плане мощнее намного, вспомнить только cosntexpr)
Оптимизации, производимые компилятором
1
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
21.01.2016, 19:26
Цитата Сообщение от maxillion Посмотреть сообщение
например F# который транслирует
чего чего он делает ?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2016, 12:15
maxillion, ну и нужно понимать, что как раз JIT всё это дело оптимизирует, т.к. это элементарная оптимизация
19h = 25

Это практически единственное, что JIT еще может оптимизировать. И это не показатель.
Миниатюры
Быстродействие double, decimal в x64  
2
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
22.01.2016, 12:35
Цитата Сообщение от Psilon Посмотреть сообщение
ну и нужно понимать, что как раз JIT всё это дело оптимизирует
Оптимизирует самое простое, тратя при этом время для запуска программы. В принципе оно и понятно почему. Вопрос в том, почему эту оптимизацию не переложат на транслятор языка, как например это сделано в F#.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2016, 12:43
maxillion, так кто ж утверждал, что JIT-компилятор всё знает на целевой машине и может все круто оптимизировать? Вот поэтому на него и возложили оптимизации. А почему не стали дублировать оптимизации в csc, да потому что это упрощало его разработку и работу. Больше кода - больше багов, больше стоимость, дольше разработка... И да, я не уверен, что F# делает это на этапе компиляции. Т.к. это тот же .Net-язык и подчиняется он общим правилам, компилируется одним и тем же джитом, соответственно и поступать должен примерно также, как и другие нет-компиляторы.
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
22.01.2016, 13:01
Цитата Сообщение от Psilon Посмотреть сообщение
так кто ж утверждал, что JIT-компилятор всё знает на целевой машине и может все круто оптимизировать?
Круто не выйдет, для него время на вес золота.
А что нужно знать о целевой машине для оптимизации этого кода ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
static int a()
{
    int x = 0;
    for (int i = 0; i < 10; i++)
    {
        x++;
    }
    return x;
}
public static void Main(string[] args) 
{
    Console.WriteLine(a()*a());
}
Цитата Сообщение от Psilon Посмотреть сообщение
И да, я не уверен, что F# делает это на этапе компиляции
Проверял на этом, делает
F#
1
2
3
4
5
6
let foo() = 5
 
[<EntryPoint>]
let main argv =  
    System.Console.WriteLine( foo()*foo() )
    0
0
22.01.2016, 13:46

Не по теме:

Пока вы тут спорите, в репо corecrl идут пуши с оптимизациями simd инструкций

0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
22.01.2016, 14:24
Цитата Сообщение от maxillion Посмотреть сообщение
Проверял на этом, делает
а проку то?
C#
Assembler
1
2
3
4
5
6
7
    Console.WriteLine(Program.a() * Program.a());
000007FE8F0C4280  sub         rsp,28h  
000007FE8F0C4284  mov         ecx,19h  
000007FE8F0C4289  call        000007FEED8BAC10  
000007FE8F0C428E  nop  
000007FE8F0C428F  add         rsp,28h  
000007FE8F0C4293  ret
F#
Assembler
1
2
3
4
5
6
    System.Console.WriteLine( foo() * foo()  )
00370450  mov         ecx,19h  
00370455  call        728B29DC  
    0
0037045A  xor         eax,eax  
0037045C  ret
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2016, 14:32
pycture, какой-то неправильный листинг, похоже на дебаг-сборку Я выше скриншот привел.

Konctantin, SIMD сейчас реализован только через библиотечку МС, насколько я помню, причем поддерживает его только RyuJit, причем если на целевой платформе SIMD'а не будет (хотя это конечно маловероятно, но все же) генерируется очень неэффективный код. Но в целом радует конечно это направление. Это не C++ AMP, но тоже ничо.
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
22.01.2016, 15:11
Цитата Сообщение от pycture Посмотреть сообщение
а проку то?
А вы посмотрите через ILspy а потом скажите есть ли прок.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
22.01.2016, 15:16
Цитата Сообщение от maxillion Посмотреть сообщение
А вы посмотрите через ILspy а потом скажите есть ли прок
а зачем смотреть на сферического коня? я реальный код исполняемый процессором привел

Добавлено через 45 секунд
Цитата Сообщение от Psilon Посмотреть сообщение
какой-то неправильный листинг, похоже на дебаг-сборку
она и есть (с оптимизацией). чтоб в студии остановить и листинг вытащить
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
22.01.2016, 15:21
Цитата Сообщение от pycture Посмотреть сообщение
чтоб в студии остановить и листинг вытащить
Дак можно и так остановить, главное правильно настроить.

Добавлено через 4 минуты
Цитата Сообщение от pycture Посмотреть сообщение
а зачем смотреть на сферического коня? я реальный код исполняемый процессором привел
А... ну если вы думаете что оптимизация сферического коня хуже, оптимизации исполняемого кода, тогда мне нечего добавить.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2016, 15:28
Цитата Сообщение от pycture Посмотреть сообщение
она и есть (с оптимизацией). чтоб в студии остановить и листинг вытащить
ну так если дебаг сборка, то результат неправильный (причем даже если стоит релиз, это не значит, что компилится релиз, ведь дебаггер подцепился). Правильный я уже выше дал, не думаю, что у тебя какой-то другой JITер

Цитата Сообщение от maxillion Посмотреть сообщение
Круто не выйдет, для него время на вес золота.
А что нужно знать о целевой машине для оптимизации этого кода ?
Еще раз, оптимизации в csc.exe не запихнули, т.к. это было дорого и усложнило бы разработку.
Поэтому они есть в JIT'е, в котором эти самые оптимизации ограничены по времени, и предподсчитать цикл он не может. Какие еще вопросы? Почему они так сделали? Потому что не хотели тратить лишние деньги, вот и все. Не считая потенциальных подводных камней. Когда модуль оптимизации один, всё просто и понятно. Когда их несколько, то начинаются забавные взаимные эффекты. Стоит вспомнить например ObjC, в котором ТРИ разных сборщика мусора, которые могут подраться и удалить живой объект.
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
22.01.2016, 15:39
Да ладно, не кипятитесь вы так , это всего лишь вопрос.

Цитата Сообщение от Psilon Посмотреть сообщение
Потому что не хотели тратить лишние деньги, вот и все.
Дак если они лишнии, то почему бы не потратить, ведь на F# не пожалели. Ладно фиг с этими деньгами, не пойму ведь f# и c# это практически аналоги, почему бы не перенести оптимизацию f# на с# ?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2016, 15:45
Цитата Сообщение от maxillion Посмотреть сообщение
Дак если они лишнии, то почему бы не потратить, ведь на F# не пожалели. Ладно фиг с этими деньгами, не пойму ведь f# и c# это практически аналоги, почему бы не перенести оптимизацию f# на с# ?
Потому что разные компиляторы. Если посмотреть историю Rosylin, они хотели переписать на .Net csc.exe (это ведь нативный компилятор на С++), так вот нишмагли) Со всеми исходниками на руках, и т.п. все тормозило так, что они отказались от этой идеи и сделали Rosylin в том виде, что он есть: просто Compiler as a service. Еще раз напоминаю, что всё это - деньги. И если когда csc.exe создавался шарп был COOL-язык майкрософта, с непонятным будущим и перспективами, и на него выделили один объем средств, то когда создавался F#, .Net победоносно шел по планете, шарп набирал популярность, и бюджет команды был совсем другим

Это конечно всё мои фантазии, но в принципе это возможные причины.
2
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
22.01.2016, 15:52
Цитата Сообщение от Psilon Посмотреть сообщение
Потому что разные компиляторы
Дак компилируют то , в одно и тоже MSIL. Значит наверно оптимизация начинается на этапе компиляции, и IL ей не подвергается, что как то глупо выходит. А может просто фшарпёры работают отдельно от сишарпёров, и не чего друг о друге не знают
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2016, 16:23
maxillion, еще раз, если есть различия на уровне Il'а, то комплияторы csc.exe fsc.exe по разному компилируют. Что наверняка так, ибо языки принципиально различаются. После того, как Il скомпилился, он будет одним и тем же джитом обрабатыаться. В шарпе проблема в том, что есть 2 этапа компиляции: text -> IL, IL -> x86. Хотя вопрос привычки. С тем же успехом люди часто путаются в потоках, например (stream/thread), есть еще пара мелочей. Со временем путаница проходит.
1
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,900
22.01.2016, 16:45
Оптимизацию можно условно поделить на "алгоритмическую" и "железную". Замена константной функции на константу, замена хвостовой рекурсии и т.п. - это "алгоритмическая" оптимизация. Подобной оптимизацией должен заниматься "компилятор в промежуточный код". А "железной" (т.е. под конкретное железо) оптимизацией должен заниматься "компилятор из промежуточного кода в машинный". "Железная" оптимизация по сути сводится к нахождению в коде неких шаблонов и замена их на соответствующий машинный код.

Добавлено через 55 секунд
Цитата Сообщение от Psilon Посмотреть сообщение
Если посмотреть историю Rosylin, они хотели переписать на .Net csc.exe (это ведь нативный компилятор на С++), так вот нишмагли) Со всеми исходниками на руках, и т.п. все тормозило так, что они отказались от этой идеи и сделали Rosylin в том виде, что он есть: просто Compiler as a service.
Откуда такая информация?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2016, 16:45

Как преобразовать 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?


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru