Перегрузки методов для числовых параметров
Имеем скажем любой метод, который что-то считает по поступающим числам. Но применяет одинаковую формулу.
Все советуют делать для каждого нужного типа свою перегрузку. Но формулу-то что, каждый раз заново писать для всех перегрузок?
Менее распространённые советы - писать формулу лишь для варианта с double или decimal, а в остальных перегрузках вызывать один из первых вариантов с приведением типов параметров. Но ведь тут мы теряем в точности мантиссы? Плюём на это и смиряемся?
Они просто повторяют формулы. И тесты похоже тоже пишут оданиковые под копирку, только с другими типами. Или у них этот код вообще по шаблону генерится, включая тесты.
Разве что этот атрибут добавляют, чтобы наверняка
[MethodImpl(MethodImplOptions.AggressiveInlining)]
Это новьё и не везде работает. Время пройдёт, тогда посмотрим.
И это не то, по-моему. Какая-то возня с функциями, вместо того, чтобы как раньше писать a + b / c * d - e.
Ещё раз гляньте мою ссылку - сами дотнетовцы в своих исходниках тупо копипастят код, который семантически выглядит одинаково, а внутри операторы для каждого типа переопределены.
Так уж решили, тут этого дофига
https://learn.microsoft.com/en-us/dotnet/api/system.numeri...
А хотелось небось T: int ?
А хотелось небось T: int ?
Хотелось T: int, double, float
И писать T a = b + c * d / e;
Всё равно все эти действия для указанных чисел определены, так что один код для всех должен быть. Копипастить вручную или генерацией, а потом везде прописывать "интерсивный инлайнинг" - какой-то лютый костыль из-за несовершенства архитектуры языка. Хотя инлайнинг похоже по другой причине прописан, но копипастинг-то остаётся.
| Method | Mean | Error | StdDev | |---------------- |-----------:|---------:|---------:| | AddNumbers | 244.7 ns | 3.52 ns | 2.94 ns | | AddInt | 243.1 ns | 1.94 ns | 1.81 ns | | SubtractNumbers | 243.1 ns | 2.98 ns | 2.79 ns | | SubtractInt | 250.6 ns | 5.00 ns | 7.93 ns | | MultiplyNumbers | 249.3 ns | 5.00 ns | 7.18 ns | | MultiplyInt | 246.3 ns | 2.88 ns | 2.56 ns | | DivideNumbers | 1,910.2 ns | 22.21 ns | 20.77 ns | | DivideInt | 1,890.8 ns | 9.41 ns | 8.34 ns |
у меня ломается моск от вот этого
T : INumber<T>
Это много где встречается. Например
public abstract class PointerEventBase<T> where T : PointerEventBase<T>, new() public sealed class ClickEvent : PointerEventBase<ClickEvent>
Это вы как такую табличку получили?
С пацанами правильными нужно дружить, а не кидаться по ним грязью
Могу проект выложить, если интересует.
Интересовала прежде всего грубая оценка производительности.