Często znane jako likely
i unlikely
makra pomagają kompilatorowi wiedzieć, czy if
zwykle będzie wprowadzane czy pomijane. Używanie go powoduje pewne (raczej niewielkie) ulepszenia wydajności.
Zacząłem ich używać niedawno i nie jestem pewien, jak często należy korzystać z takich wskazówek. Obecnie używam go do sprawdzania błędów if
, które zwykle są oznaczone jako unlikely
. Na przykład:
mem = malloc(size);
if (unlikely(mem == NULL))
goto exit_no_mem;
Wydaje się to w porządku, ale sprawdzanie błędów if
zdarza się dość często iw konsekwencji użycie wspomnianych makr.
Moje pytanie brzmi, czy to zbyt wiele, aby mieć likely
i unlikely
makra na każdym Sprawdzanie błędów if
?
Skoro już tu jesteśmy, jakie inne miejsca są często używane?
W moim obecnym użyciu znajduje się w bibliotece, która dokonuje abstrakcji z podsystemu czasu rzeczywistego, więc programy stałyby się przenośne między RTAI, QNX i innymi. To powiedziawszy, większość funkcji jest raczej niewielka i bezpośrednio wywołuje jedną lub dwie inne funkcje. Wiele z nich to nawet static inline
funkcje.
Przede wszystkim nie jest to aplikacja, którą mógłbym profilować. Identyfikacja „wąskich gardeł” nie ma sensu, ponieważ jest to biblioteka, a nie samodzielna aplikacja.
Po drugie, jest to coś w rodzaju „wiem, że to mało prawdopodobne, równie dobrze mogę to powiedzieć kompilatorowi”. Nie próbuję aktywnie optymalizować if
.
likely
i unlikely
istnieje i co robią. Nie znalazłem niczego, co faktycznie sugerowałoby, kiedy i gdzie najlepiej ich używać.