Twoja intuicja może się z czasem poprawić. Wyrzucę to, może trochę kontrowersyjne, ale przez wiele lat używania VTune i CodeAnalyst, a teraz CodeXL, powiedziałbym, że jestem o wiele bardziej dokładny w swoich intuicjach niż wcześniej, jeśli chodzi o to, gdzie będą hotspoty, przynajmniej punkt, w którym nie jestem już całkowicie zaskoczony, gdy profiluję jakiś kod. To nie znaczy, że staram się optymalizować wszystko na ślepo.
Profilowanie faktycznie zwiększyło moją zależność od profilerów, a nie zmniejszyło je. Po prostu mówię, że mogę łatwiej przewidzieć, jakie będą wyniki profilowania do pewnego stopnia, a ponadto skutecznie wyeliminować punkty aktywne i skrócić czas potrzebny na zakończenie operacji użytkownika, bez konieczności wykonywania ciemnych cięć w ciemności i zaginięcia (coś, co może to zrobić nawet podczas korzystania z profilera, dopóki nie zrozumiesz nie tylko, czym są hotspoty, ale dlaczego dokładnie są one hotspotami w odniesieniu do, powiedzmy, brakujących pamięci podręcznej).
Jednak dopiero gdy zacząłem używać profilerów, zacząłem ulepszać tę intuicję. Jednym z powodów jest to, że jeśli dobrze znasz swój kod, przeczucia mogą być poprawne w odniesieniu do największych i najbardziej oczywistych punktów aktywnych, ale nie wszystkich subtelności pomiędzy nimi. Oczywiście, jeśli operacja wykonywana przez użytkownika zajmuje godzinę, a istnieje jeden rozwarty algorytm kwadratowej złożoności przetwarzający dane wejściowe obejmujące sto tysięcy elementów, prawdopodobnie prawdopodobnie wyjdziesz z bogatego hazardu, oszczędzając całe swoje życie na idei, że jest to kwadratowa złożoność algorytm zawiniony tutaj. Ale to nie daje żadnego szczegółowego wglądu lub, powiedzmy, dokładnie wiedzieć, co nie przyczynia się do czasu.
Przy rozpoczynaniu profilowania i sprawdzaniu, gdzie wszystkie rzeczy, które według ciebie mogły być większym czynnikiem przyczyniającym się do upływu czasu, nie było wiele, warto mieć tyle wartości; nie rozbieżne oczywiste źródła nieefektywności, ale te, które podejrzewasz, mogą być nieco nieefektywne, ale po profilowaniu zdają sobie sprawę, że w niewielkim stopniu przyczyniły się w dowolnym momencie. I to potencjalnie tam, gdzie zyskujesz najbardziej intuicyjny wgląd, to stwierdzenie, że jesteś źle pokazywany we wszystkich subtelnych obszarach, w których nie jest oczywiste, ile czasu spędzasz.
Ludzka intuicja przekraczająca oczywistą złożoność algorytmiczną często zaczyna się niepoprawnie, ponieważ to, co jest wydajne dla maszyny, a co dla ludzkiego umysłu, jest bardzo różne. Na początku nie przychodzi tak intuicyjnie, aby myśleć o hierarchiach pamięci przechodzących od rejestrów do pamięci podręcznej procesora, pamięci DRAM i dysku. Nie przychodzi intuicyjnie sądzić, że redundantna arytmetyka może być szybsza niż wykonywanie większej liczby rozgałęzień lub uzyskiwanie dostępu do pamięci w tabeli przeglądowej w celu pominięcia niektórych zadań przetwarzania. Zwykle myślimy o tym, ile pracy jest do zrobienia, pomijając takie rzeczy, jak koszt podejmowania decyzji oraz obciążenia pamięci i sklepów. To, co jest wydajne dla sprzętu, jest często bardzo sprzeczne z intuicją w sposób, który na początku przełamie wszystkie ludzkie założenia,
Ulepszanie tej intuicji może pomóc, poprzez profilowanie, projektowanie interfejsu . Projektowanie interfejsów jest bardzo kosztowne ze względu na zmiany, a koszty rosną proporcjonalnie do liczby miejsc w zależności od tego interfejsu. Kiedy zaczniesz poprawiać swoją intuicję, możesz zacząć projektowanie interfejsów lepiej za pierwszym razem, w taki sposób, że pozostawiasz tchnienie dla przyszłej optymalizacji bez kosztownych zmian projektowych. Ponownie jednak ta intuicja jest czymś, co generalnie rozwijasz i rozwijasz w nieskończoność, zawsze mając ten profil pod ręką.