Почему INumber<T>.CreateX(int n) настолько медленный по сравнению с неявным преобразованием для чисел с плавающей запятоC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему INumber<T>.CreateX(int n) настолько медленный по сравнению с неявным преобразованием для чисел с плавающей запято

Сообщение Anonymous »

Я работаю над математической библиотекой, и мне хотелось бы иметь возможность преобразовать ее для использования новых интерфейсов INumber в System.Numerics. Приведенные здесь методы часто находятся на горячем пути, поэтому было бы хорошо, если бы они были как можно более быстрыми, но при этом с ними было бы приятно работать. Я сравнивал их по ходу дела и заметил кое-что странное.
В некоторых случаях мы делим значение массива по его индексу из-за использования System.Numerics. , это невозможно сделать с помощью неявного преобразования, как если бы тип был определен, рекомендуемый метод, по-видимому, должен использовать INumber.Create{Checked|Saturating|Truncating}(int n)
Методы тестирования, которые я использую, довольно просты, например:

Код: Выделить всё

public static double[] DivideByImplicit(double[] values)
{
double[] result = new double[values.Length];
for (int i = 1; i < result.Length; i++)
{
result[i] = values[i] / i;
}

return result;
}

// Overloads for other types (int, long, float, decimal)
// ...

public static T[] DivideByChecked(T[] values) where T : INumber
{
T[] result = new T[values.Length];
for (int i = 1; i < values.Length;  i++)
{
result[i] = values[i] / T.CreateChecked(i);
}

return result;
}

// Same again but for Saturating/Truncating
// ...
Для int, long и decimal результаты находятся в пределах нескольких процентных пунктов, но когда дело доходит до чисел с плавающей запятой > и double производительность снижается гораздо сильнее: ~25 % для double, но до 100 % увеличения времени для float:



Метод
Категории
Счет
Среднее
Ошибка
StdDev
Соотношение
RatioSD



< tr>
DivideByImplicitDecimal
десятичный
1000
29 292,733 нс
146,0540 нс
136,6190 нс1,00
0,00< /strong>


DivideByCheckedDecimal
десятичное число
1000
28 884,550 нс
82,0562 нс
76,7554 нс
0,990.00


DivideBySaturatingDecimal
десятичное
1000
29 948,023 нс
< td style="text-align: right;">61,6380 нс
54,6404 нс
1.02
0.01


DivideByTruncatingDecimal
десятичное число
1000
30 367,067 нс
67,0287 нс
62,6987 ns
1.04
0.01











DivideByImplicitDouble

double
1000

1067,421 нс
20,5178 нс
24,4250 нс
1,00
0.00


DivideByCheckedDoubledouble
1000
1,342,562 нс
17,7660 нс
14,8354 нс
1,25
0,03


DivideBySaturatingDouble
double
1000
1343,400 нс
16,4938 нс
13,7731 нс
1,25
0,04


DivideByTruncatingDouble
double
1000
1394,057 нс
27,2936 нс
44,0740 нс
1,31
0.04












DivideByImplicitFloat
float
1000
636,576 нс
4,9312 нс4,6127 нс
1,00
0,00

< tr>
DivideByCheckedFloat
float
1000
1282,109 нс
13,9466 нс
12,3633 нс
2,01
0,02


DivideBySaturatingFloat
float
1000
1288,927 нс
10,4365 нс
8,7149 нс
2,03
0.02


DivideByTruncatingFloat
float
1000
1291,335 нс
20,6446 нс
17,2392 нс
17,2392 нс
2,03
0,04












DivideByImplicitInt
int
1000
1210,849 нс
13,0819 нс
12,2368 нс
1,00
0,00


DivideByCheckedInt
int
1000< /td>
1202,773 нс
7,3879 нс6,5492 нс
0,99
0.01


DivideBySaturatingInt
int
1000
1201,430 нс
8,0413 нс
6,7149 нс
6,7149 нс
6,7149 нс
0,99
0,01


< td>DivideByTruncatingInt
int
1000
1199,158 нс
9,0592 нс
7,0728 нс
0,99
0,01












DivideByImplicitLong
long
1000
1712,002 нс19,3905 нс
17.1891 ns
1,00
0.00


DivideByCheckedLong
long
1000
1716,886 нс
17,9844 нс
16,8226 нс
1,00
0,01


DivideBySaturatingLong
long
1000
1,712.213 нс
31,2334 нс
29,2157 нс
1,00
0,02
< /tr>

DivideByTruncatingLong
long
1000
1771,120 нс
34,2546 нс
40,7777 нс
1,03
0.03



Почему влияние такое сильное выше при преобразовании в число с плавающей запятой/, чем любой другой числовой тип? Для краткости не показано, но я также проводил тесты для массивов размером 1, 100 и 1_000_000, и замедление не было заметно на 1 или 100, но было аналогичным на 1_000_000.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ion-for-fl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»