Я работаю над математической библиотекой, и мне хотелось бы иметь возможность преобразовать ее для использования новых интерфейсов 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
, чем любой другой числовой тип? Для краткости не показано, но я также проводил тесты для массивов размером 1, 100 и 1_000_000, и замедление не было заметно на 1 или 100, но было аналогичным на 1_000_000.
Я работаю над математической библиотекой, и мне хотелось бы иметь возможность преобразовать ее для использования новых интерфейсов INumber в System.Numerics. Приведенные здесь методы часто находятся на горячем пути, поэтому было бы хорошо, если бы они были как можно более быстрыми, но при этом с ними было бы приятно работать. Я сравнивал их по ходу дела и заметил кое-что странное. В некоторых случаях мы делим значение массива по его индексу из-за использования System.Numerics. , это невозможно сделать с помощью неявного преобразования, как если бы тип был определен, рекомендуемый метод, по-видимому, должен использовать INumber.Create{Checked|Saturating|Truncating}(int n) Методы тестирования, которые я использую, довольно просты, например: [code]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 // ... [/code] Для int, long и decimal результаты находятся в пределах нескольких процентных пунктов, но когда дело доходит до чисел с плавающей запятой > и double производительность снижается гораздо сильнее: ~25 % для double, но до 100 % увеличения времени для float:
Метод Категории Счет Среднее Ошибка StdDev Соотношение RatioSD
Почему влияние такое сильное выше при преобразовании в число с плавающей запятой/[code]double[/code], чем любой другой числовой тип? Для краткости не показано, но я также проводил тесты для массивов размером 1, 100 и 1_000_000, и замедление не было заметно на 1 или 100, но было аналогичным на 1_000_000.
Я работаю над математической библиотекой, и мне хотелось бы иметь возможность преобразовать ее для использования новых интерфейсов INumber в System.Numerics. Приведенные здесь методы часто находятся на горячем пути, поэтому было бы хорошо, если бы...
Предположим, у меня есть две функции: func1 и func2. func1 возвращает список из 3 целых чисел, а func2 принимает кортеж из 3 целых чисел. Как мне преобразовать список в кортеж таким образом, чтобы можно было предотвратить ошибки с помощью средств...
Кто-нибудь знает прототип BFont::DrawString(wchar_t*, int, int, int, int, int, int) в библиотеке BFont++? Кажется, она была популярна где-то в 2003 году, мне бы хотелось получить прототип этой функции для модификации старой программы. Буду очень...