Funkcje matematyczne frameworka .NET obsługują głównie przepływy o podwójnej precyzji, nie występują przeciążenia pojedynczej precyzji (zmiennoprzecinkowe). Podczas pracy z danymi o pojedynczej dokładności w scenariuszu wysokiej wydajności powoduje to niepotrzebne rzutowanie, a także obliczanie funkcji z większą precyzją niż jest to wymagane, w związku z czym w pewnym stopniu wpływa to na wydajność.Operacje matematyczne z jedną precyzją w .NET?
Czy istnieje sposób na uniknięcie niektórych dodatkowych kosztów procesora? Na przykład. czy istnieje biblioteka matematyczna open source z przeciążeniami pływaka, która bezpośrednio wywołuje instrukcje FPU? (Rozumiem, że wymagałoby to wsparcia w CLR). I właściwie nie jestem pewien, czy współczesne procesory mają nawet pojedyncze instrukcje precyzji.
Kwestia ta została częściowo zainspirowana to pytanie na temat optymalizacji funkcji esicy:
Kiedy odnosić się do instrinsics jest taki sam jak funkcje zewnętrzne? - w jaki sposób implementowane są funkcje matematyczne, a wewnętrzne definiowane w języku. AFAIK CLR można łatwo rozszerzyć, aby wprowadzić np. public static extern double Sin (float a) oprócz wersji podwójnej precyzji. – redcalx
Czy mówisz o implementacji w natywnym kodzie? Pośrednie wywołanie P/Invoke dla pojedynczej operacji zmiennoprzecinkowej całkowicie zanegowałoby próbę uniknięcia wpływu wydajności na działanie z 'Sin (double)'. Nazwy wewnętrzne są deklarowane jako "zewnętrzne", ale nie są P/Wywoływanie - kod macierzysty dla nich jest wewnętrznie obsługiwany przez samą JIT, aby były tak wydajne, jak to tylko możliwe. –
Może więc można uzyskać pewną wydajność, jeśli twój algorytm był taki, że można wykonać pojedyncze P/Invoke, które wykonuje wiele operacji swobodnych. – Fantius