Pracujemy na średniej wielkości bazie kodu C ++ (10Mloc), która dzięki naszym wysiłkom optymalizacyjnym staje się jednolicie powolna .
Ta podstawa kodu to zestaw bibliotek, które łączymy, aby je uruchomić. Kiedy opracowano ogólne ramy komunikacji tych bibliotek, nacisk położono na wydajność, a później, gdy dodano więcej części, ogólne ramy nie uległy znacznej zmianie. Optymalizacja została przeprowadzona w razie potrzeby i w miarę ewolucji naszego sprzętu. Dzięki temu droga wczesna decyzja stała się widoczna dopiero znacznie później. Jesteśmy teraz w punkcie, w którym dalsze optymalizacje są znacznie droższe, ponieważ wymagałyby przepisania dużych części bazy kodu. Zbliżamy się do niepożądanego minimum lokalnego, ponieważ wiemy, że w zasadzie kod powinien być w stanie działać znacznie szybciej.
Czy istnieją jakieś udane metodologie, które pomagają zdecydować, które kroki przejmą ewolucję bazy kodu w kierunku globalnie optymalnego rozwiązania, które nie są łatwo mylone przez łatwe możliwości optymalizacji?
EDYTOWAĆ
Aby odpowiedzieć na pytanie, w jaki sposób obecnie profilujemy:
Tak naprawdę mamy tylko 2 różne scenariusze, w których można użyć tego kodu, oba są krępująco równoległe. Profilowanie odbywa się zarówno przy uśrednieniu czasu zegara ściennego na dużej próbce danych wejściowych, jak i bardziej szczegółowych przebiegach (koszty instrukcji, nieprzewidziane oddziały i problemy z buforowaniem). Działa to dobrze, ponieważ działamy wyłącznie na naszych wyjątkowo homogenicznych maszynach (klaster kilku tysięcy identycznych maszyn). Ponieważ zazwyczaj wszystkie nasze maszyny są zajęte przez większość czasu, działają szybciej, więc możemy spojrzeć na dodatkowe nowe rzeczy. Problem polega oczywiście na tym, że gdy pojawią się nowe warianty danych wejściowych, mogą zostać ukarani za spóźnienie, ponieważ usunęliśmy najbardziej oczywiste mikroefektywności w przypadku innych przypadków użycia, co może zawęzić liczbę „optymalnie działających” scenariuszy.
sloc. Nazwałem to „umiarkowanym rozmiarem”, ponieważ nie mam pojęcia, co uważa się za „duże”.