Wpis z mikrobloga

#programowanie #programowanie15k #jezykc

Czy można jakoś zoptymalizować poniższy warunek, tak zeby nie używać "if", czyli zastosować tzn. "branchless":

if (pp_wall_start > RC_walls_start) RC_walls_start = pp_wall_start;
Próbowałem w ten sposób, ale wolałbym bez mnożenia no i nie do końća mi działało:

RC_walls_start = pp_wall_start * (pp_wall_start > RC_walls_start);
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@ZawzietyRobaczek: 1. Użyj profilera, bo może optymalizujesz coś niepotrzebnie. 2. Sprawdź jak często wpadasz w tego brancha i jeśli więcej niż 50% to może lepiej odwrócić warunek. 3. Operator potrójny bywa czasami szybszy, ale nie wiem czy w tym przypadku.
  • Odpowiedz
@ZawzietyRobaczek: Niepotrzebnie optymalizujesz taki warunek, nie zajmuj się warunkiem tylko unikaj najlepiej sprawdzania tego warunku i zrób tak żeby dane były odgórnie poprawne by nie było ich sprawdzać warunkami. Przykład z mnożeniem który podałeś działa bo warunek większości zwróci jeden lub zero, a gdy mnożymy coś przez zero to będzie zero, gdy jeden to mamy tą liczbę więc zastępujemy warunek if. Po prostu przy zerze zawołaj alternatywną metodę. Sposób z
  • Odpowiedz
@ZawzietyRobaczek: Ale wiesz, że if w kodzie źródłowym wcale nie oznacza, że wygenerowany kod będzie zawierał skok warunkowy? Zbytnia kombinacja może wręcz obniżyć wydajność zamiast ją poprawić. Walnij profile i zobacz czy w ogóle jest sens się w to bawić.
  • Odpowiedz