Udostępnij za pośrednictwem


Zalecenia dotyczące optymalizowania kosztów kodu

Dotyczy tego zalecenia z listy kontrolnej 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 przy użyciu mniejszej lub tańszej ilości zasobów.

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 poprawy ogólnej wydajności.

Optymalizując kod, można zidentyfikować i wyeliminować nieefektywności, które mogą prowadzić do zwiększonego 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 wydajną 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.
Ścieżki aktywne 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. Dzięki zmniejszeniu zużycia zasobów można zaoszczędzić pieniądze, gdy aplikacje obsługują duże ilości danych lub mają duże obciążenia ruchu.

Ulepszenia kodu są najbardziej efektywne w przypadku wykonywania innych działań związanych z optymalizacją kosztów w zakresie skalowania, praw, nadmiarowości i ograniczania przepustowości. Po dokonaniu kontroli nad tymi podstawowymi elementami możesz rozważyć optymalizację kodu.

Możesz nie wiedzieć, czy masz nieefektywny kod. Funkcje bezserwerowe, automatyczne skalowanie i niezawodność mogą maskować niewydajność 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 w czasie wykonywania. Umożliwia deweloperom zbieranie informacji o kluczowych metrykach, takich jak zużycie zasobów (użycie procesora CPU lub pamięci) i czas wykonywania. Instrumentując kod, deweloperzy mogą uzyskiwać wgląd w gorące ścieżki kodu, identyfikować wąskie gardła wydajności i optymalizować kod pod kątem lepszej wydajności i efektywności ekonomicznej.

W idealnym środowisku należy przeprowadzić analizę kodu na wczesnym etapie cyklu życia tworzenia oprogramowania. Wcześniej przechwycenie problemu z kodem, tym tańsze jest rozwiązanie problemu.

Zautomatyzuj 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 testowanie to nadal jest symulacją produkcji. Środowisko produkcyjne zapewnia najczystszą wiedzę na temat optymalizacji kodu.

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

Identyfikowanie i 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 aktywne 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ć ścieżki aktywne, 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. Ta miara 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 ulepszeń. Usuń wszelkie niepotrzebne operacje w ścieżce kodu, które mogą mieć wpływ na wydajność.

  • Usuwanie niepotrzebnych wywołań funkcji: Przejrzyj kod. Zidentyfikuj wszystkie funkcje, które nie są niezbędne dla żądanej funkcjonalności i mogą mieć negatywny wpływ na wydajność. Jeśli na przykład wywołanie funkcji wykonuje walidację, która miała miejsce 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 niepotrzebne iteracji lub warunki, które można wyeliminować. Upraszczanie i optymalizowanie tych struktur może poprawić 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, jeśli 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, gdy jest 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 kontrole tokenów. Oceń, czy negatywnie wpływają na wydajność.

Kompromis: Optymalizacja kodu i gorących ścieżek wymaga wiedzy deweloperów w zakresie identyfikowania nieefektywności kodu. Osoby o wysokich kwalifikacjach mogą wymagać spędzania czasu na innych zadaniach.

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

Ocena wykorzystania współbieżności polega na ocenie, czy przetwarzanie asynchroniczne, wielowątkowanie lub przetwarzanie wieloprocesorowe może zmaksymalizować wykorzystanie zasobów i zmniejszyć koszty. Korzystając z przetwarzania asynchronicznego, wielowątkowego lub 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ć opłacalność.

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 bezblokowania. Możesz na przykład uruchomić proces, a następnie wstrzymać go, aby umożliwić ukoń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 obsługiwany przez nią model programowania asynchronicznego, na przykład async/await na platformie .NET lub obietnice w języku JavaScript.

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

  • Wielowątkowość: wielowątkowość umożliwia jednoczesne uruchamianie wielu wątków pojedynczego procesu.

    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, której używasz na potrzeby najlepszych rozwiązań wielowątkowych. Utwórz wiele wątków lub pul wątków do obsługi równoległego wykonywania zadań.

    Zaimplementuj mechanizmy synchronizacji, takie jak blokady, mutexes 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 wieloprocesorowe: Przetwarzanie wieloprocesowe może mieć procesy uruchamiane równolegle. 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 platformę, z której korzystasz, i poznaj jego możliwości wieloprocesorowe. Rozważmy na przykład moduł wieloprocesorowy 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żywanie 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 celu optymalizacji kosztów wybierz pozycję Zestawy SDK przeznaczone do optymalizacji użycia zasobów i poprawy wydajności. Ważne jest, aby ocenić funkcje i możliwości poszczególnych zestawów SDK. Należy wziąć pod uwagę 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 w zakresie optymalizacji zasobów i poprawy wydajności. Zintegruj wybrany zestaw SDK z bazą kodu, postępując zgodnie z podaną 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 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.

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

  • Porównanie kosztów: porównaj koszty związane z systemami operacyjnymi. Należy wziąć pod uwagę 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ść: Oceń bezpieczeństwo i stabilność 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ż pomoc techniczną dostawcy: oceń poziom obsługi 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ą udzielić pomocy, jeśli tego potrzebujesz.

Optymalizowanie przechodzenia przez sieć

Optymalizacja przechodzenia 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 należy przenieść, jednocześnie obniżając koszty.

Przeanalizuj obciążenie i zidentyfikuj wszelkie niepotrzebne transfery danych między składnikami. Unikaj transferu 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ć liczbę niepotrzebnych wywołań lub żądań wsadowych, minimalizując transfer danych. 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 efektywności komunikacji sieciowej. Dzięki optymalizacji protokołów sieciowych 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żmy na przykład użycie protokołów, takich jak HTTP/2 za pośrednictwem protokołu HTTP/1.1. Te protokoły zostały zaprojektowane w celu zwiększenia wydajności dzięki zmniejszeniu opóźnień i optymalizacji transferu danych. Użyj bibliotek i struktur w aplikacji, aby używać tych protokołów.

  • Obsługa kompresji: 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 nawiązywaniem nowych połączeń dla każdego żądania. Buforowanie połączeń może zwiększyć wydajność komunikacji sieciowej, unikając obciążeń związanych z konfiguracją i usuwaniem połączeń. Wybierz bibliotekę lub strukturę puli połączeń i skonfiguruj je pod kątem potrzeb związanych z obciążeniem.

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

Minimalizuj obciążenie sieci

Zminimalizuj ilość ruchu sieciowego i transferu danych między składnikami obciążenia. Zmniejszenie obciążenia sieciowego pozwala obniżyć koszty związane z ruchem wychodzącym i przychodzącym danych oraz zwiększyć 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ń dotyczących 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 ich rozmiaru. Rozważ techniki, takie jak kompresowanie danych przed przesłaniem lub użycie bardziej wydajnych formatów danych. Zmniejszając rozmiar 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 jedno 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 odtwarzane na końcu odbioru.

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

    Format serializacji Opis
    Bufory protokołu (protobuf) Binarny format serializacji, który oferuje wydajne kodowanie i dekodowanie danych strukturalnych. Używa plików definicji typu do definiowania struktur komunikatów.
    MessagePack Binarny format serializacji do kompaktowania transmisji przez przewody. 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 w pracy. Format JSON jest oparty na tekście i ma szeroką obsługę międzyplatformową.
    Binarny kod JSON (BSON) Binarny format serializacji podobny do formatu JSON, ale przeznaczony do wydajnej serializacji i deserializacji. Dane BSON zawierają 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 postaci. 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 odnosi się do usprawnienia 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 przez sieć.

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 użytkowników.

  • Dostrajanie parametrów 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 zapytanych kolumn, można znacznie skrócić czas uruchamiania 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, które wyszukują określone nazwy użytkowników.

    Zidentyfikuj najczęściej używane kolumny i utwó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ń, biorąc pod uwagę określone wymagania dotyczące danych i minimalizując niepotrzebne pobieranie 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 zapytania 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 można następnie obsłużyć 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żyj 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. Optymalizuj użycie tabel tymczasowych, zmiennych i kursorów, aby zminimalizować zużycie zasobów.

Organizowanie danych

Organizowanie danych na potrzeby wydajnego dostępu i pobierania obejmuje strukturyzowanie i przechowywanie danych w sposób maksymalizujący wydajność i minimalizujący zużycie zasobów. Może poprawić czas odpowiedzi na zapytania, zmniejszyć koszty transferu danych i zoptymalizować wykorzystanie magazynu.

Poniżej przedstawiono kilka technik wydajnego organizowania danych:

  • Partycja: partycjonowanie obejmuje podzielenie dużego zestawu danych na mniejsze, bardziej zarządzane podzestawy nazywane partycjami. Poszczególne partycje można przechowywać oddzielnie, aby umożliwić przetwarzanie równoległe i lepszą wydajność zapytań. Można na przykład podzielić dane na partycje 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 to technika 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 poszczególne zapytania.

  • 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 klientach. Partycjonowanie danych na podstawie regionów klienta lub danych demograficznych pozwala 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 architektury

Oceń architekturę obciążenia, aby zidentyfikować możliwości optymalizacji zasobów. Celem jest korzystanie z odpowiednich usług dla 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 optymalizację 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.

Używanie wzorców projektowych

Wzorce projektowe to rozwiązania wielokrotnego użytku, które pomagają deweloperom rozwiązywać cykliczne problemy projektowe. 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, zapewniając wytyczne dotyczące wydajnej alokacji zasobów i zarządzania nimi. Na przykład wzorzec wyłącznika pomaga zapobiec niepotrzebnemu zużyciu zasobów, zapewniając mechanizm obsługi i odzyskiwania po awariach 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 obsługa: wzorce projektowe promują kod modułowy i ustrukturyzowany, który ułatwia zrozumienie, modyfikowanie i konserwację. Mogą one prowadzić do oszczędności kosztów w zakresie zmniejszonych wysiłków związanych z debugowaniem i konserwacją.

  • Skalowalność i wydajność: Wzorce projektowe ułatwiają projektowanie skalowalnych i wydajnych systemów. Wzorce, takie jak wzorzec Cache-Aside, mogą zwiększyć wydajność dzięki buforowaniu często używanych danych w celu zmniejszenia potrzeby 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 przejrzyj i zaktualizuj 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ń. Dzięki optymalizacji konfiguracji można skutecznie przydzielić zasoby i uniknąć nadmiernej aprowizacji, aby zaoszczędzić koszty.

Refaktoryzacja architektury

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 wdrożenie architektury mikrousług, zaimplementowanie wzorca wyłącznika i użycie przetwarzania bezserwerowego. Optymalizując architekturę, można osiągnąć lepsze wykorzystanie zasobów i wydajność kosztów.

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ż prawa do 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ą aprowizacją lub nadmierną aprowizacją.

Kompromis: Zmiana 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

Kod instrumentowania: 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ących i zoptymalizowanych: 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.

Korzystając 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 , w celu wydajnej komunikacji między usługami i aplikacjami.

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

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

W przypadku serializacji danych platforma Azure obsługuje różne formaty serializacji, w tym dane JSON i XML. Wybierz odpowiedni format serializacji na podstawie rozmiaru danych, wymagań dotyczących wydajności i potrzeb dotyczących współdziałania.

Optymalizacja dostępu do danych: platforma Azure udostępnia usługi buforowania, takie jak Azure Cache for Redis. Za pomocą buforowania można przechowywać często używane dane bliżej aplikacji, co powoduje szybsze pobieranie i zmniejszenie obciążenia zaplecza.

  • Indeksowanie i optymalizacja 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żna poprawić ogólną wydajność pobierania danych.

  • Mapowanie relacyjne obiektów (ORM): Platforma Azure obsługuje platformy ORM, takie jak Entity Framework. Te struktury upraszczają dostęp do danych i mapowanie między kodami obiektowymi i relacyjnymi lub bazami danych 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ść dzięki zmniejszeniu liczby rund sieci i wstępnej kompilacji instrukcji 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ń.