Piszemy kod bajtowy dla języka skompilowanego na wysokim poziomie, a po odrobinie profilowania i optymalizacji stało się jasne, że obecne największe obciążenie związane z wydajnością to instrukcja switch, z której korzystamy. aby przejść do przypadków kodu bajtowego.Adres etykiet (MSVC)
Sprawdziliśmy, jak wyciągnąć adres etykiety każdej sprawy i zapisać ją w strumieniu samego kodu bajtowego, a nie ID instrukcji, który zwykle włączamy. Jeśli to zrobimy, możemy pominąć tabelę skoku i bezpośrednio przejść do lokalizacji kodu aktualnie wykonywanej instrukcji. Działa to fantastycznie w GCC, jednak MSVC nie obsługuje takiej funkcji.
Próbowaliśmy użyć wbudowanego zestawu, aby pobrać adres etykiet (i przeskoczyć do nich), ale działa on jednak, używając wbudowanego zestawu, dzięki czemu można uniknąć całej funkcji przez optymalizator MSVC.
Czy istnieje sposób, aby umożliwić optymalizatorowi nadal przebiegać nad kodem? Niestety, nie możemy wyodrębnić wbudowanego zestawu do innej funkcji niż ta, w której zostały wykonane etykiety, ponieważ nie ma możliwości odwołania się do etykiety dla innej funkcji, nawet w złożonym zestawie. Wszelkie myśli lub pomysły? Twój wkład jest bardzo doceniany, dzięki!
Czy próbowałeś wskaźników funkcyjnych? –
Co powiesz na umieszczanie adresów funkcji zamiast adresów etykiet w bajtodzie? Następnie masz jedną funkcję dla każdego identyfikatora instrukcji. Chyba że twoja pętla pobierania-wykonywania jest w twojej dużej funkcji-z-etykietami. –
Jeśli użyłbym funkcji dla każdego z przypadków i użytych wskaźników funkcji zamiast adresów etykiet, to by działało.Jednak czuję, że obciążenie wywołane przez funkcję byłoby tak wielkie, że unieważniłoby jakąkolwiek wydajność, nawet jeśli funkcja była trywialna (brak argumentów, brak powrotu). Wypróbuję to i dzięki za publikację. – Trevor