Udostępnij za pośrednictwem


Zalecenia dotyczące optymalizowania kosztów kodu

Dotyczy tego zalecenia listy kontrolnej dotyczącej optymalizacji kosztów platformy Azure Well-Architected Framework:

CO:11 Optymalizowanie kosztów kodu. Oceń i zmodyfikuj kod, aby spełniał wymagania funkcjonalne i niefunkcjonalne z mniej lub tańszymi zasobami.

W tym przewodniku opisano zalecenia dotyczące optymalizowania kosztów kodu. Optymalizacja kodu to proces poprawy wydajności, wydajności i opłacalności kodu aplikacji. Efektywna optymalizacja kodu obejmuje wprowadzanie zmian w kodzie w celu zmniejszenia zużycia zasobów, zminimalizowania czasu wykonywania i zwiększenia ogólnej wydajności.

Optymalizując kod, można zidentyfikować i wyeliminować nieefektywności, które mogą prowadzić do zwiększenia zużycia zasobów i wyższych kosztów. Możesz skrócić czas przetwarzania, użycie pamięci i obciążenie sieci, co może prowadzić do szybszego i szybszego reagowania aplikacji. Zwiększona wydajność zwiększa środowisko użytkownika i umożliwia systemowi wydajne obsługę większych obciążeń.

Definicje

Okres Definicja
Instrumentacja kodu Praktyka dodawania fragmentów kodu lub bibliotek do kodu, które zbierają dane i monitorują wydajność kodu podczas wykonywania.
Współbieżność Wykonywanie wielu procesów w tym samym czasie.
Serializacja danych Proces konwertowania obiektów danych na format, który można przechowywać lub przesyłać, a następnie rekonstruować je z powrotem do ich oryginalnej formy w razie potrzeby.
Gorące ścieżki Krytyczne lub często uruchamiane sekcje programu, które wymagają wysokiej wydajności i małych opóźnień.

Kluczowe strategie projektowania

Optymalizacja kosztów kodu oznacza poprawę kodu w celu osiągnięcia tej samej funkcjonalności przy mniejszej liczbie zasobów na wystąpienie, takich jak cykle procesora CPU, pamięć i magazyn. Zmniejszając zużycie zasobów, możesz zaoszczędzić pieniądze, gdy aplikacje obsługują duże ilości danych lub mają duże obciążenia.

Ulepszenia kodu są najbardziej efektywne w przypadku wykonywania innych działań optymalizacji kosztów związanych ze skalowaniem, prawami, nadmiarowością i ograniczaniem przepustowości. Po zapoznaniu się z tymi podstawowymi elementami można rozważyć optymalizację kodu.

Możesz nie wiedzieć, czy masz nieefektywny kod. Funkcje bezserwerowe, automatyczne skalowanie i niezawodność mogą maskować nieefektywność kodu. Poniższe strategie mogą pomóc w zidentyfikowaniu i naprawieniu kodu aplikacji, który kosztuje więcej niż powinien.

Instrumentacja kodu

Instrumentacja kodu to praktyka dodawania fragmentów kodu lub bibliotek, które zbierają dane i monitorują wydajność kodu podczas wykonywania. Umożliwia deweloperom zbieranie informacji o kluczowych metrykach, takich jak użycie zasobów (użycie procesora CPU lub pamięci) i czas wykonywania. Instrumentując kod, deweloperzy mogą uzyskać wgląd w gorące ścieżki kodu, zidentyfikować wąskie gardła wydajności i zoptymalizować kod pod kątem lepszej wydajności i efektywności kosztowej.

W idealnym środowisku należy przeprowadzić analizę kodu na wczesnym etapie cyklu życia tworzenia oprogramowania. Wcześniejszy problem z kodem jest tańszy, który należy rozwiązać.

Automatyzuj jak najwięcej tej analizy kodu. Użyj dynamicznych i statycznych narzędzi do analizy kodu, aby zmniejszyć nakład pracy ręcznej. Należy jednak pamiętać, że ten test jest nadal symulacją produkcji. Środowisko produkcyjne zapewnia najczystsze zrozumienie optymalizacji kodu.

Kompromis: Narzędzia do monitorowania kodu mogą zwiększyć koszty.

Optymalizowanie ścieżek gorących

Instrumentując kod, można zmierzyć zużycie zasobów ścieżek kodu. Te pomiary ułatwiają identyfikowanie ścieżek gorących. Ścieżki gorące mają znaczący wpływ na wydajność i użycie zasobów. Są to krytyczne lub często uruchamiane sekcje programu, które wymagają wysokiej wydajności i małych opóźnień.

Aby zidentyfikować gorące ścieżki, należy wziąć pod uwagę następujące zadania:

  • Analizowanie danych środowiska uruchomieniowego: zbieranie i analizowanie danych środowiska uruchomieniowego w celu zidentyfikowania obszarów kodu, które zużywają znaczne zasoby, takie jak procesor CPU, pamięć lub operacje we/wy. Poszukaj wzorców lub sekcji kodu, które są często uruchamiane lub trwają długo.

  • Mierzenie wydajności: użyj narzędzi profilowania lub struktur testowania wydajnościowego, aby zmierzyć czas wykonywania i zużycie zasobów ścieżek kodu. Ten pomiar pomaga zidentyfikować wąskie gardła i obszary na potrzeby poprawy.

  • Rozważmy logikę biznesową i efekt użytkownika: Oceń znaczenie ścieżek kodu na podstawie ich istotności dla funkcjonalności aplikacji lub krytycznych operacji biznesowych. Określ, które ścieżki kodu mają kluczowe znaczenie dla dostarczania wartości użytkownikom lub spełnienia wymagań dotyczących wydajności.

    Przejrzyj zalecenia dotyczące wydajności specyficzne dla języka programowania, z którym pracujesz. Oceń kod pod kątem tych zaleceń, aby zidentyfikować obszary pod kątem poprawy. Usuń wszelkie niepotrzebne operacje w ścieżce kodu, które mogą mieć wpływ na wydajność.

  • Usuń niepotrzebne wywołania funkcji: Przejrzyj kod. Zidentyfikuj wszystkie funkcje, które nie są niezbędne dla żądanej funkcjonalności i mogą negatywnie wpłynąć na wydajność. Jeśli na przykład wywołanie funkcji wykonuje walidację, która wystąpiła wcześniej w kodzie, możesz usunąć to niepotrzebne wywołanie funkcji.

  • Minimalizuj operacje rejestrowania: rejestrowanie może być przydatne do debugowania i analizy, ale nadmierne rejestrowanie może mieć wpływ na wydajność. Oceń konieczność każdej operacji rejestrowania i usuń wszelkie niepotrzebne wywołania rejestrowania, które nie są krytyczne dla analizy wydajności.

  • Optymalizowanie pętli i warunkowych: analizowanie pętli i warunkowych w kodzie. Zidentyfikuj wszelkie niepotrzebne iteracji lub warunki, które można wyeliminować. Uproszczenie i optymalizacja tych struktur może zwiększyć wydajność kodu.

  • Zmniejsz niepotrzebne przetwarzanie danych: przejrzyj kod pod kątem wszelkich niepotrzebnych operacji przetwarzania danych, takich jak nadmiarowe obliczenia lub przekształcenia. Wyeliminuj te niepotrzebne operacje, aby zwiększyć wydajność kodu.

  • Minimalizuj żądania sieciowe: jeśli kod wysyła żądania sieciowe, zminimalizuj liczbę żądań i zoptymalizuj ich użycie. Żądania wsadowe, gdy jest to możliwe i unikaj niepotrzebnych rund w celu zwiększenia wydajności.

  • Minimalizuj alokacje: zidentyfikuj obszary, w których występuje nadmierna alokacja pamięci. Zoptymalizuj kod, zmniejszając niepotrzebne alokacje i ponownie używając istniejących zasobów, jeśli to możliwe.

    Minimalizując alokacje, można zwiększyć wydajność pamięci i ogólną wydajność. Użyj odpowiednich strategii zarządzania pamięcią i odzyskiwania pamięci dla języka programowania.

  • Zmniejsz rozmiar struktury danych: oceń rozmiar struktur danych, takich jak klasy, i zidentyfikuj obszary, w których jest to możliwe. Przejrzyj wymagania dotyczące danych i wyeliminuj niepotrzebne pola lub właściwości. Zoptymalizuj użycie pamięci, wybierając odpowiednie typy danych i wydajnie pakując dane.

  • Ocena implementacji krzyżowych: rozważ efekty implementacji krzyżowych, takich jak oprogramowanie pośredniczące lub testy tokenów. Oceń, czy negatywnie wpływają one na wydajność.

Kompromis: Optymalizacja kodu i ścieżek gorących wymaga wiedzy deweloperów w zakresie identyfikowania nieefektywności kodu. Osoby te wysoko wykwalifikowanych mogą potrzebować czasu na inne zadania.

Ocena użycia współbieżności

Ocena użycia współbieżności polega na ocenie, czy przetwarzanie asynchroniczne, wielowątkowanie lub przetwarzanie wieloprocesorowe może zmaksymalizować wykorzystanie zasobów i zmniejszyć wydatki. Korzystając z przetwarzania asynchronicznego, wielowątku lub przetwarzania wieloprocesorowego, można obsługiwać więcej zadań z tymi samymi zasobami. Jednak niezwykle ważne jest zapewnienie właściwej implementacji, aby uniknąć większych obciążeń i utrzymać efektywność kosztową.

Aby ocenić, czy użycie współbieżności jest dobrym rozwiązaniem, możesz postępować zgodnie z następującymi wytycznymi:

  • Przetwarzanie asynchroniczne: przetwarzanie asynchroniczne umożliwia wykonywanie nieblokujące. Możesz na przykład uruchomić proces, a następnie wstrzymać go, aby umożliwić zakończenie drugiego procesu.

    Określ składniki kodu lub operacje, które można uruchomić asynchronicznie. Zidentyfikuj używany język programowania lub strukturę i poznaj model programowania asynchronicznego, który obsługuje, na przykład async/await na platformie .NET lub obietnice w języku JavaScript.

    Zmień strukturę kodu, aby używać asynchronicznych konstrukcji programowania, włączając nieblokujące wykonywanie zadań. Rozdziel długotrwałe lub intensywnie korzystające z operacji we/wy operacje z głównego wątku wykonywania przy użyciu metod asynchronicznych lub wywołań zwrotnych. Użyj asynchronicznych interfejsów API lub bibliotek obsługiwanych przez język programowania lub platformę, aby obsługiwać asynchroniczne przepływy pracy.

  • Wielowątkowość: w wielowątku uruchamiasz wiele wątków pojedynczego procesu jednocześnie.

    Zidentyfikuj sekcje kodu, które można uruchamiać jednocześnie i niezależnie. Zapoznaj się z dokumentacją lub wytycznymi specyficznymi dla języka programowania lub platformy używanej w celu uzyskania najlepszych rozwiązań wielowątkowych. Utwórz wiele wątków lub pul wątków, aby obsługiwać równoległe wykonywanie zadań.

    Zaimplementuj mechanizmy synchronizacji, takie jak blokady, mutexy lub semafory, aby zapewnić bezpieczeństwo wątków i zapobiec warunkom wyścigu, gdy kod uzyskuje dostęp do udostępnionych zasobów. Rozważ użycie abstrakcji wyższego poziomu, takich jak pule wątków lub biblioteki równoległości oparte na zadaniach, aby usprawnić zarządzanie wieloma wątkami i uprościć kontrolę współbieżności.

  • Przetwarzanie wieloprocesowe: Przetwarzanie wieloprocesowe może mieć równoległe działanie procesów. Może zapewnić lepsze wykorzystanie wielu rdzeni procesora CPU niż wielowątkowość.

    Ustal, czy obciążenie lub operacje w kodzie nadają się do przetwarzania równoległego. Zidentyfikuj język programowania lub strukturę, z której korzystasz, i zapoznaj się z jego możliwościami wieloprocesorowymi. Rozważmy na przykład moduł przetwarzania wieloprocesowego w języku Python lub strumieni równoległych w języku Java. Zaprojektuj kod, aby podzielić obciążenie na wiele niezależnych zadań, które mogą być przetwarzane współbieżnie.

    Użyj wieloprocesorowych interfejsów API lub bibliotek do tworzenia procesów równoległych i zarządzania nimi. Rozłóż obciążenie między te interfejsy API lub biblioteki. Aby umożliwić koordynację i udostępnianie danych między wieloma procesami, zaimplementuj mechanizmy komunikacji, takie jak komunikacja międzyprocesowa (IPC), pamięć współdzielona lub przekazywanie komunikatów, w zależności od języka programowania lub struktury.

Korzystanie z odpowiednich zestawów SDK

W przypadku optymalizacji kosztów wybierz zestawy SDK przeznaczone do optymalizacji użycia zasobów i poprawy wydajności. Ważne jest, aby ocenić funkcje i możliwości każdego zestawu SDK. Rozważ jego zgodność z językiem programowania i środowiskiem programistycznym.

Oto wskazówki ułatwiające wybór najlepszych zestawów SDK dla obciążenia:

  • Przeprowadzanie testów wydajnościowych: porównaj użycie zasobów i wydajność zestawów SDK za pomocą testów wydajnościowych. Wybierz zestaw SDK, który najlepiej spełnia Twoje potrzeby pod względem optymalizacji zasobów i poprawy wydajności. Zintegruj wybrany zestaw SDK z bazą kodu, postępując zgodnie z udostępnioną dokumentacją i wytycznymi.

  • Monitorowanie użycia zasobów i optymalizowanie kodu: monitorowanie użycia zasobów za pomocą zaimplementowanego zestawu SDK. Zbierz szczegółowe informacje z monitorowania i analizy, aby zoptymalizować kod.

Wybieranie odpowiedniego systemu operacyjnego

Większość języków kodowania może działać w różnych systemach operacyjnych, dlatego ważne jest, aby ocenić system operacyjny pod kątem tańszych alternatyw. Jeśli alternatywny system operacyjny obsługuje te same lub podobne funkcje przy niższych kosztach, warto rozważyć. Wybierając tańszy system operacyjny, możesz potencjalnie obniżyć koszty opłat licencyjnych i kosztów infrastruktury.

Odpowiedni system operacyjny może przyczynić się do ogólnej optymalizacji kosztów dla obciążenia. Aby wybrać odpowiedni system operacyjny dla obciążenia, wypróbuj następujące działania:

  • Oceń wymagania: poznaj konkretne potrzeby obciążenia, w tym języki kodowania i platformy, których używasz. Rozważ wszelkie zależności lub integracje z innymi systemami.

  • Rozważ zgodność: upewnij się, że wybrany system operacyjny jest zgodny z językami kodowania, strukturami i wszystkimi używanymi bibliotekami lub narzędziami innych firm. Zapoznaj się z dokumentacją i pomocą techniczną społeczności dla systemu operacyjnego, aby upewnić się, że ma on dobrą zgodność ze stosem technologii.

  • Funkcja oceny: określ, czy alternatywny system operacyjny obsługuje tę samą lub podobną funkcjonalność co bieżący system operacyjny. Oceń, czy udostępnia niezbędne funkcje i możliwości wymagane przez obciążenie.

  • Porównanie kosztów: porównaj koszty skojarzone z systemami operacyjnymi. Rozważ czynniki, takie jak opłaty licencyjne, koszty pomocy technicznej i wymagania dotyczące infrastruktury. Poszukaj tańszych alternatyw, które mogą spełniać wymagania obciążenia bez naruszania funkcjonalności.

  • Rozważ wydajność i optymalizację: oceń możliwości wydajności i optymalizacji alternatywnego systemu operacyjnego. Poszukaj testów porównawczych, analiz przypadków lub porównań wydajności, aby zrozumieć, jak działa w rzeczywistych scenariuszach.

  • Przejrzyj zabezpieczenia i stabilność: Ocena bezpieczeństwa i stabilności alternatywnego systemu operacyjnego. Poszukaj aktualizacji zabezpieczeń, poprawek i pomocy technicznej społeczności, aby upewnić się, że system operacyjny jest aktywnie utrzymywany i jest bezpieczny i stabilny.

  • Rozważ obsługę dostawcy: oceń poziom pomocy technicznej dostawcy, który jest dostępny dla alternatywnego systemu operacyjnego. Sprawdź, czy istnieją oficjalne kanały pomocy technicznej, dokumentacja i społeczność użytkowników, którzy mogą zapewnić pomoc, jeśli tego potrzebujesz.

Optymalizowanie ruchu sieciowego

Optymalizacja przechodzenia do sieci polega na zminimalizowaniu ruchu sieciowego między składnikami obciążenia. Transfer danych często wiąże się ze skojarzonym kosztem. Minimalizując ruch sieciowy, można zmniejszyć ilość danych, które muszą być przesyłane, jednocześnie obniżając koszty.

Przeanalizuj obciążenie i zidentyfikuj wszelkie niepotrzebne transfery danych między składnikami. Unikaj przesyłania nadmiarowych lub zduplikowanych danych i przesyłaj tylko istotne informacje. Jeśli na przykład składnik wielokrotnie żąda tych samych danych z innego składnika, jest to kandydat do optymalizacji. Kod można refaktoryzować, aby zmniejszyć niepotrzebne wywołania lub żądania wsadowe, minimalizując transferowane dane. Aplikacje mogą wysyłać całe obiekty lub struktury danych, gdy potrzebne jest tylko kilka pól. Optymalizując kod w celu wysyłania tylko wymaganych danych, można zminimalizować rozmiar każdego transferu danych.

Optymalizowanie protokołów sieciowych

Protokoły sieciowe odgrywają kluczową rolę w wydajności komunikacji sieciowej. Optymalizując protokoły sieciowe, można zwiększyć ogólną wydajność transferu danych i zmniejszyć zużycie zasobów.

Rozważ następujące sugestie:

  • Wybieranie wydajnych protokołów: wybierz protokoły, które są znane ze swojej wydajności pod względem szybkości transferu danych i minimalizując obciążenie. Rozważ na przykład użycie protokołów, takich jak HTTP/2 za pośrednictwem protokołu HTTP/1.1. Te protokoły mają na celu poprawę wydajności dzięki zmniejszeniu opóźnień i optymalizacji transferu danych. Użyj bibliotek i struktur w aplikacji, aby używać tych protokołów.

  • Kompresja obsługi: Zaimplementuj mechanizmy kompresji w protokołach sieciowych, aby zmniejszyć rozmiar przesyłanych danych. Kompresja może znacznie zmniejszyć ilość danych przesyłanych przez sieć, co prowadzi do zwiększenia wydajności i zmniejszenia użycia przepustowości. Kompresja po stronie serwera jest zwykle włączona w kodzie aplikacji lub konfiguracji serwera.

  • Korzystanie z buforowania połączeń: buforowanie połączeń umożliwia ponowne użycie ustanowionych połączeń sieciowych w celu zmniejszenia obciążenia związanego z ustanawianiem nowych połączeń dla każdego żądania. Buforowanie połączeń może zwiększyć wydajność komunikacji sieciowej, unikając obciążenia związanego z konfiguracją połączenia i usuwaniem. Wybierz bibliotekę puli połączeń lub strukturę i skonfiguruj je zgodnie z potrzebami obciążeń.

  • Implementowanie innych optymalizacji: Zapoznaj się z innymi optymalizacjami specyficznymi dla obciążenia i środowiska sieciowego. Na przykład można użyć buforowania zawartości, równoważenia obciążenia i kształtowania ruchu w celu dalszej optymalizacji przechodzenia do sieci.

Minimalizuj obciążenie sieci

Zminimalizuj ilość ruchu sieciowego i transferu danych między składnikami obciążenia. Dzięki zmniejszeniu obciążenia sieciowego można obniżyć koszty związane z ruchem wychodzącym i przychodzącym danych oraz poprawić ogólną wydajność sieci.

Rozważ następujące techniki:

  • Zmniejsz nadmiarowe żądania: przeanalizuj kod, aby zidentyfikować wszelkie zduplikowane lub niepotrzebne żądania. Zamiast wykonywać wiele żądań dla tych samych danych, możesz zmodyfikować kod, aby pobrać dane raz i użyć ich ponownie w razie potrzeby.

  • Optymalizowanie rozmiaru danych: przejrzyj przesyłane dane między składnikami lub systemami i poszukaj możliwości zminimalizowania rozmiaru. Rozważ techniki, takie jak kompresowanie danych przed przesłaniem lub użycie bardziej wydajnych formatów danych. Dzięki zmniejszeniu rozmiaru danych można zmniejszyć użycie przepustowości sieci i zwiększyć ogólną wydajność.

  • Żądania wsadowe: jeśli ma to zastosowanie, rozważ dzielenie wielu mniejszych żądań na pojedyncze większe żądanie. Przetwarzanie wsadowe zmniejsza obciążenie związane z nawiązywaniem wielu połączeń i zmniejsza ogólną transmisję danych.

  • Używanie serializacji danych: Serializacja danych to proces konwertowania złożonych struktur danych lub obiektów na format, który można łatwo przesyłać za pośrednictwem sieci lub przechowywać w trwałym systemie magazynowania. Ta strategia obejmuje reprezentowanie danych w standardowym formacie, dzięki czemu dane mogą być efektywnie przesyłane, przetwarzane i rekonstruowane na końcu odbioru.

    Wybierz format serializacji, który jest kompaktowy, szybki i odpowiedni dla wymagań obciążenia.

    Format serializacji opis
    protokołu (protobuf) Binarny format serializacji, który oferuje wydajne kodowanie i dekodowanie danych ustrukturyzowanych. Używa plików definicji typowych do definiowania struktur komunikatów.
    MessagePack Binarny format serializacji do kompaktowej transmisji przez przewód. Obsługuje różne typy danych i zapewnia szybką serializacji i wydajność deserializacji.
    JavaScript Object Notation (JSON) Powszechnie używany format serializacji danych, który jest czytelny dla człowieka i łatwy do pracy. Kod JSON jest oparty na tekście i ma szeroką obsługę międzyplatformową.
    Binarny kod JSON (BSON) Binarny format serializacji, który jest podobny do formatu JSON, ale przeznaczony do wydajnej serializacji i deserializacji. Kod BSON zawiera dodatkowe typy danych, które nie są dostępne w formacie JSON.

    W zależności od formatu serializacji należy zaimplementować logikę, aby serializować obiekty lub struktury danych w wybranym formacie i deserializować je z powrotem do ich oryginalnej formy. Tę logikę można zaimplementować przy użyciu bibliotek lub struktur, które zapewniają możliwości serializacji dla formatu.

Optymalizowanie dostępu do danych

Optymalizacja dostępu do danych polega na usprawnieniu wzorców i technik pobierania i przechowywania danych w celu zminimalizowania niepotrzebnych operacji. Podczas optymalizowania dostępu do danych można zaoszczędzić koszty, zmniejszając użycie zasobów, zmniejszając pobieranie danych i poprawiając wydajność przetwarzania danych. Rozważ techniki, takie jak buforowanie danych, wydajne wykonywanie zapytań dotyczących danych i kompresja danych.

Korzystanie z mechanizmów buforowania

Buforowanie obejmuje przechowywanie często używanych danych bliżej składników, które ich wymagają. Ta technika zmniejsza potrzebę przechodzenia przez sieć przez obsługę danych z pamięci podręcznej zamiast pobierania ich za pośrednictwem sieci.

Rozważ następujące mechanizmy buforowania:

  • Używanie zewnętrznej pamięci podręcznej: jednym z popularnych rozwiązań buforowania jest sieć dostarczania zawartości. Pomaga zminimalizować opóźnienia i zmniejszyć przechodzenie przez sieć przez buforowanie zawartości statycznej bliżej odbiorców.

  • Dostraj parametry buforowania: skonfiguruj parametry buforowania, takie jak czas wygaśnięcia (TTL), aby zoptymalizować korzyść buforowania przy jednoczesnym zminimalizowaniu potencjalnych wad. Ustawienie odpowiedniego czasu wygaśnięcia gwarantuje, że buforowane dane pozostają świeże i istotne.

  • Używanie buforowania w pamięci: oprócz zewnętrznych rozwiązań buforowania rozważ zaimplementowanie buforowania w pamięci w aplikacji. Buforowanie w pamięci może pomóc w użyciu bezczynnych zasobów obliczeniowych i zwiększyć gęstość obliczeniową przydzielonych zasobów.

Optymalizowanie ruchu bazy danych

Możesz zwiększyć wydajność komunikacji aplikacji z bazą danych. Poniżej przedstawiono kilka kluczowych zagadnień i technik optymalizacji ruchu bazy danych:

  • Tworzenie indeksów: Indeksowanie to proces tworzenia struktur danych, które zwiększają szybkość pobierania danych. Tworząc indeksy dla często odpytywanych kolumn, można znacznie skrócić czas wykonywania zapytań. Jeśli na przykład masz tabelę użytkowników z kolumną dla nazw użytkowników, możesz utworzyć indeks w kolumnie nazwy użytkownika, aby przyspieszyć zapytania wyszukujące określone nazwy użytkowników.

    Zidentyfikuj najczęściej używane kolumny i twórz indeksy w tych kolumnach, aby przyspieszyć pobieranie danych. Regularnie analizuj i optymalizuj istniejące indeksy, aby upewnić się, że są one nadal skuteczne. Unikaj nadmiernego indeksowania, ponieważ może negatywnie wpływać na operacje wstawiania i aktualizowania.

  • Optymalizowanie zapytań: projektowanie wydajnych zapytań przez uwzględnienie określonych wymagań dotyczących danych i zminimalizowanie niepotrzebnego pobierania danych. Zacznij od użycia odpowiednich typów sprzężeń (na przykład sprzężenia wewnętrznego i sprzężenia lewego) na podstawie relacji między tabelami. Użyj technik optymalizacji zapytań, takich jak wskazówki dotyczące zapytań, analiza planu zapytań i ponowne zapisywanie zapytań, aby zwiększyć wydajność.

  • Wyniki zapytań pamięci podręcznej: wyniki często uruchamianych zapytań można przechowywać w pamięci lub pamięci podręcznej. Kolejne wykonania tego samego zapytania mogą być następnie obsługiwane z pamięci podręcznej, co eliminuje potrzebę kosztownych operacji bazy danych.

  • Użyj struktury mapowania relacyjnego obiektów (ORM): użyj funkcji ORM, takich jak ładowanie leniwe, buforowanie i przetwarzanie wsadowe, aby zoptymalizować pobieranie danych i zminimalizować rundy bazy danych. Używaj struktur ORM, takich jak Entity Framework dla języka C# lub Hibernate dla języka Java.

  • Optymalizowanie procedur składowanych: analizowanie i optymalizowanie logiki i wydajności procedur składowanych. Celem jest uniknięcie niepotrzebnych obliczeń lub nadmiarowych zapytań w procedurach składowanych. Zoptymalizuj użycie tabel tymczasowych, zmiennych i kursorów, aby zminimalizować zużycie zasobów.

Organizowanie danych

Organizowanie danych pod kątem efektywnego dostępu i pobierania obejmuje strukturyzowanie i przechowywanie danych w sposób, który maksymalizuje wydajność i minimalizuje zużycie zasobów. Może ona poprawić czas odpowiedzi na zapytania, zmniejszyć koszty transferu danych i zoptymalizować wykorzystanie magazynu.

Poniżej przedstawiono kilka technik efektywnego organizowania danych:

  • Partycja: Partycjonowanie obejmuje podzielenie dużego zestawu danych na mniejsze, bardziej zarządzane podzestawy nazywane partycjami. Każdą partycję można przechowywać oddzielnie, aby umożliwić przetwarzanie równoległe i lepszą wydajność zapytań. Można na przykład partycjonować dane na podstawie określonego zakresu wartości lub dystrybuować dane między serwerami. Ta technika może zwiększyć skalowalność, zmniejszyć rywalizację i zoptymalizować wykorzystanie zasobów.

  • Fragmentowanie: fragmentowanie jest techniką dzielenia danych w poziomie między wiele wystąpień bazy danych lub serwerów. Każdy fragment zawiera podzestaw danych, a zapytania mogą być przetwarzane równolegle w tych fragmentach. Fragmentowanie może zwiększyć wydajność zapytań, dystrybuując obciążenie i zmniejszając ilość danych, do których uzyskuje dostęp każde zapytanie.

  • Kompresja: Kompresja danych polega na zmniejszeniu rozmiaru danych w celu zminimalizowania wymagań dotyczących magazynu i zwiększenia wydajności transferu danych. Ponieważ skompresowane dane zajmują mniej miejsca na dysku, pozwala to zaoszczędzić na kosztach magazynowania. Skompresowane dane można również przesyłać szybciej za pośrednictwem sieci i zmniejszać koszty transferu danych.

Rozważmy na przykład scenariusz, w którym masz duży zestaw danych informacji o kliencie. Partycjonując dane na podstawie regionów klientów lub danych demograficznych, można dystrybuować obciążenie między wiele serwerów i zwiększyć wydajność zapytań. Możesz również skompresować dane, aby zmniejszyć koszty magazynowania i zwiększyć wydajność transferu danych.

Optymalizowanie projektu rozwiązania

Oceń architekturę obciążenia, aby zidentyfikować możliwości optymalizacji zasobów. Celem jest wykorzystanie odpowiednich usług do odpowiedniego zadania.

Aby osiągnąć ten cel, może być konieczne przeprojektowanie części architektury w celu użycia mniejszej liczby zasobów. Rozważ użycie usług bezserwerowych lub zarządzanych oraz zoptymalizowanie alokacji zasobów. Optymalizując architekturę, można spełnić wymagania funkcjonalne i niefunkcjonalne, jednocześnie zużywając mniej zasobów na wystąpienie.

Korzystanie z wzorców projektowych

Wzorce projektowe to rozwiązania wielokrotnego użytku, które ułatwiają deweloperom rozwiązywanie powtarzających się problemów projektowych. Zapewniają one ustrukturyzowane podejście do projektowania kodu, który jest wydajny, możliwy do utrzymania i skalowalny.

Wzorce projektowe pomagają zoptymalizować wykorzystanie zasobów systemowych, udostępniając wskazówki dotyczące efektywnej alokacji zasobów i zarządzania nimi. Na przykład wzorzec wyłącznika pomaga zapobiec niepotrzebnemu użyciu zasobów, zapewniając mechanizm obsługi awarii i odzyskiwania po awarii w kontrolowany sposób.

Wzorce projektowe mogą pomóc w optymalizacji kosztów kodu w następujący sposób:

  • Skrócony czas programowania: Wzorce projektowe zapewniają sprawdzone rozwiązania typowych problemów projektowych, które mogą zaoszczędzić czas programowania. Postępując zgodnie z ustalonymi wzorcami, deweloperzy mogą unikać powtarzalnej pracy i skupić się na wdrażaniu określonych wymagań aplikacji.

  • Ulepszona konserwacja: wzorce projektowe promują modularny i ustrukturyzowany kod, który jest łatwiejszy do zrozumienia, zmodyfikowania i konserwacji. Mogą one prowadzić do oszczędności kosztów w zakresie zmniejszonych działań związanych z debugowaniem i konserwacją.

  • Skalowalność i wydajność: Wzorce projektowe ułatwiają projektowanie skalowalnych i wydajnych systemów. Wzorce, takie jak wzorzec z odkładaniem do pamięci podręcznej, mogą zwiększyć wydajność, buforując często używane dane, aby zmniejszyć potrzebę kosztownych obliczeń lub wywołań zewnętrznych.

Aby zaimplementować wzorce projektowe, deweloperzy muszą zrozumieć zasady i wytyczne każdego wzorca i zastosować je w kodzie. Rozważ zidentyfikowanie odpowiedniego wzorca problemu, zrozumienie jego struktury i składników oraz zintegrowanie wzorca z ogólnym projektem.

Dostępne są różne zasoby, takie jak dokumentacja, samouczki i przykładowy kod. Te zasoby mogą pomóc deweloperom efektywnie uczyć się i implementować wzorce projektowe.

Zmienianie konfiguracji

Regularnie sprawdzaj i aktualizuj konfigurację obciążenia, aby upewnić się, że jest ona zgodna z bieżącymi wymaganiami. Rozważ dostosowanie ustawień rozmiaru zasobów i konfiguracji na podstawie wymagań dotyczących obciążeń. Optymalizując konfiguracje, można efektywnie przydzielić zasoby i uniknąć nadmiernej aprowizacji, aby zaoszczędzić koszty.

Architektura refaktoryzacji

Oceń architekturę obciążenia i zidentyfikuj możliwości refaktoryzacji lub przeprojektowania składników w celu zoptymalizowania zużycia zasobów. Rozważ techniki, takie jak wdrażanie architektury mikrousług, implementowanie wzorca wyłącznika i używanie przetwarzania bezserwerowego. Optymalizując architekturę, można osiągnąć lepsze wykorzystanie zasobów i efektywność kosztową.

Modyfikowanie rozmiarów zasobów

Ciągłe monitorowanie i analizowanie wykorzystania zasobów obciążenia. Na podstawie obserwowanych wzorców i trendów dostosuj rozmiar zasobów i ustawienia konfiguracji, aby zoptymalizować zużycie zasobów.

Rozważ uprawnienia maszyn wirtualnych, dostosowywanie alokacji pamięci i optymalizowanie pojemności magazynu. Korzystając z praw do zasobów, można uniknąć niepotrzebnych kosztów związanych z niedostateczną lub nadmierną aprowizacją.

Kompromis: Przepracowanie kodu i architektury może nie pasować do bieżących harmonogramów projektów i może prowadzić do harmonogramu i poślizgu kosztów.

Ułatwienia platformy Azure

Instrumentacja kodu: platforma Azure udostępnia narzędzia do monitorowania i rejestrowania, takie jak Azure Monitor, Application Insights i Log Analytics. Za pomocą tych narzędzi można śledzić i analizować wydajność i zachowanie kodu w czasie rzeczywistym.

Identyfikowanie ścieżek gorąca i optymalizowanie: usługa Application Insights i profiler usługi Application Insights ułatwiają identyfikowanie i optymalizowanie ścieżek gorących w kodzie przez analizowanie czasów wykonywania i użycia zasobów. Możesz zminimalizować niepotrzebne alokacje pamięci i zoptymalizować użycie pamięci za pomocą profilera.

Korzystanie z odpowiednich zestawów SDK: platforma Azure oferuje zestawy SDK w wielu językach programowania, zoptymalizowane pod kątem wydajności i łatwości użycia. Te zestawy SDK udostępniają wstępnie utworzone funkcje i biblioteki, które współdziałają z usługami platformy Azure, aby zmniejszyć potrzebę implementacji niestandardowej.

Optymalizacja przechodzenia do sieci: różne usługi platformy Azure obsługują szybkie protokoły sieciowe, takie jak HTTP/2 i QUIC , umożliwiające wydajną komunikację między usługami i aplikacjami.

Usługi platformy Azure, takie jak Azure Database for PostgreSQL — serwer elastyczny, obsługują buforowanie połączeń.

pomoc techniczna platformy Azure przetwarzanie wsadowe w różnych usługach, dzięki czemu można grupować wiele operacji razem i uruchamiać je w jednym żądaniu. Przetwarzanie wsadowe może znacznie zwiększyć wydajność i zmniejszyć obciążenie sieci.

W odniesieniu do serializacji danych pomoc techniczna platformy Azure różne formaty serializacji, w tym JSON i XML. Wybierz odpowiedni format serializacji na podstawie rozmiaru danych, wymagań dotyczących wydajności i wymagań dotyczących współdziałania.

Optymalizacja dostępu do danych: platforma Azure udostępnia usługi buforowania, takie jak Azure Cache for Redis. Buforowanie umożliwia przechowywanie często używanych danych bliżej aplikacji, co skutkuje szybszym pobieraniem i zmniejszeniem obciążenia zaplecza.

  • Optymalizacja indeksowania i zapytań: usługi platformy Azure, takie jak Azure SQL Database i Azure Cosmos DB , zapewniają możliwości indeksowania w celu zoptymalizowania wydajności zapytań. Wybierając odpowiednią strategię indeksowania i optymalizując zapytania, możesz zwiększyć ogólną wydajność pobierania danych.

  • Mapowanie relacyjne obiektów (ORM): pomoc techniczna platformy Azure struktury ORM, takie jak Entity Framework. Te struktury upraszczają dostęp do danych i mapowanie między kodami obiektowymi i relacyjnymi bazami danych lub NoSQL.

  • Optymalizacja procedur składowanych: usługi platformy Azure, takie jak Azure SQL Database , umożliwiają tworzenie i optymalizowanie procedur składowanych. Procedury składowane mogą zwiększyć wydajność, zmniejszając liczbę rund sieci i prekompilując instrukcje SQL.

  • Partycjonowanie i dzielenie na fragmenty: platforma Azure oferuje możliwości partycjonowania i fragmentowania w usługach, takich jak Azure Cosmos DB i Azure SQL Database. Partycjonowanie umożliwia dystrybucję danych między wieloma węzłami w celu optymalizacji skalowalności i wydajności.

  • Kompresowanie danych: usługi platformy Azure obsługują techniki kompresji danych, takie jak GZIP i DEFLATE.

Optymalizacja architektury: platforma Azure udostępnia wskazówki dotyczące architektury i wzorce projektowe do projektowania skalowalnych, odpornych i wydajnych aplikacji. Aby uzyskać więcej informacji, zobacz Wzorce projektowe.

Lista kontrolna optymalizacji kosztów

Zapoznaj się z pełnym zestawem zaleceń.