ביצועי אפליקציות

ספריית הלקוח של Google Ads ל-‎ .NET מפשטת את האינטראקציות של האפליקציה עם Google Ads API, עם מינימום הגדרות מצדכם. עם זאת, הביצועים הכוללים תלויים מאוד באופן השימוש בספרייה ובאופן השילוב שלה באפליקציה.

במדריך הזה מוסבר איך לבצע אופטימיזציה של הביצועים באפליקציות .NET, והוא משלים את השיטות המומלצות שרלוונטיות באופן כללי ל-Google Ads API.

שימוש חוזר ב-GoogleAdsClient כשהדבר אפשרי

GoogleAdsClient מייצג את הסשן של המשתמש כשמבצעים קריאות ל-API. הוא מספק אופטימיזציות כמו:

  • שמירת ערוצי gRPC במטמון שמשמשים את שירותי ה-API. כך מקצרים את זמן ההגדרה כשמבצעים קריאות ראשוניות ל-API.
  • שימוש חוזר בטוקנים של גישה כשזה אפשרי. כך מצטמצם מספר ה-round trips שספריית הלקוח של Google Ads .NET צריכה לבצע כדי לרענן את אסימוני הגישה.

מומלץ להשתמש באסימוני גישה מחשבון ברמת ניהול, אם אפשר

  • אם יש לכם טוקן גישה שהונפק ברמת חשבון הניהול, אתם יכולים להשתמש בו כדי לבצע קריאות ל-API בכל חשבונות הלקוח ב-Google Ads שנכללים בהיררכיה של החשבון הזה. כשמשלבים את זה עם שימוש חוזר במופעי GoogleAdsClient, אפשר לצמצם עוד יותר את מספר ההעברות הלוך ושוב שספריית הלקוח צריכה לבצע כדי לרענן את אסימוני הגישה.

כשהדבר אפשרי, כדאי להשתמש ב-SearchStream במקום בחיפוש

GoogleAdsService.Search יכול לשלוח כמה בקשות עם מספור עמודים כדי להוריד את הדוח כולו, אבל GoogleAdsService.SearchStream שולח בקשה אחת ויוצר חיבור קבוע ל-Google Ads API בלי קשר לגודל הדוח. השימוש ב-SearchStream עשוי לשפר את הביצועים בהשוואה להחלפת דפים, כי הוא מבטל את זמן הרשת הנדרש להעברה הלוך ושוב כדי לבקש כל דף בנפרד בתגובה של Search, בהתאם לאפליקציה. במאמר השוואה בין Search ל-SearchStream מוסבר יותר על האופטימיזציה הזו.

ניהול ידני של רענון טוקן הגישה

בסביבות מסוימות, כמו Google Cloud Functions, יכול להיות שלא תהיה אפשרות לעשות שימוש חוזר במופעי GoogleAdsClient. בסביבות כאלה יכולות להיות שיטות מומלצות משלהן לשימור נתונים ולשימוש חוזר בהם. במקרים כאלה, אפשר להרחיב את המחלקה GoogleAdsConfig כדי לבצע רענון של טוקני גישה משלכם באופן הבא.

// Create your own config class by extending the GoogleAdsConfig class.

class MyGoogleAdsConfig : GoogleAdsConfig
{
    public MyGoogleAdsConfig() : base()
    {
        // Disable the library's in-built channel caching mechanism.
        this.UseChannelCache = false;
    }
    protected override ICredential CreateCredentials()
    {
        // TODO: Create your own ICredentials object here. You may refer to the
        // default implementation of GoogleAdsConfig::CreateCreateCredentials
        // for an example.
    }
}

// Use your own config class when initializing the GoogleAdsClient instance.

MyGoogleAdsConfig myconfig = new MyGoogleAdsConfig();
GoogleAdsClient client = new GoogleAdsClient(myconfig);

קומפילציה של גרסת build להפצה

כשפורסים את האפליקציה בשרת, חשוב לוודא שהיא עוברת קומפילציה באמצעות הגדרת הפצה. כשמשתמשים בהגדרת הניפוי באגים, האפליקציה עוברת קומפילציה עם נתוני ניפוי באגים סמליים מלאים וללא אופטימיזציה.

יצירת פרופיל לאפליקציה

כדאי ליצור פרופיל של האפליקציה גם לגבי השימוש במעבד (CPU) וגם לגבי השימוש בזיכרון, כדי לזהות צווארי בקבוק בביצועים. ‫Visual Studio מספק כלי אבחון שיעזרו לכם ליצור פרופיל של האפליקציה. יש גם כלי פרופיל מסחריים אחרים שזמינים.

שימוש בשיטות אסינכרוניות

תכנות אסינכרוני באמצעות פרדיגמת async-await עוזר להימנע מנקודות צוואר בקבוק בביצועים ולשפר את ההיענות הכוללת של האפליקציה. ספריית Google Ads .NET יוצרת שיטות אסינכרוניות לכל השירותים ולכל שיטות ה-RPC.

ביטול של שיטות אסינכרוניות

אפשר להשתמש בפרמטר callSettings כדי להעביר CancellationToken לשיטות אסינכרוניות:

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(3000);
CallSettings callSettings = CallSettings.FromCancellationToken(cancellationTokenSource.Token);

string query = "SELECT campaign.name FROM campaign";
var request = new SearchGoogleAdsStreamRequest()
{
    CustomerId = customerId.ToString(),
    Query = query,
};

GoogleAdsServiceClient googleAdsService = client.GetService(
    Services.V25.GoogleAdsService);

googleAdsService.SearchStream(request,
    delegate (SearchGoogleAdsStreamResponse resp)
    {
        foreach (GoogleAdsRow googleAdsRow in resp.Results)
        {
            // Process the row.
        }
    }, callSettings
);

השבתת הרישום ביומן כשמתאפשר

ספריית Google Ads .NET משביתה את הרישום ביומן כברירת מחדל ומשתמשת בגישה של רישום ביומן לפי דרישה, מה שמשפר את הביצועים של האפליקציה. אם מפעילים את הרישום ביומן, חשוב להשבית אותו בסביבת הייצור. אם אתם צריכים לעקוב אחרי בקשות ספציפיות שנכשלו בסביבת הייצור, אתם יכולים לבצע אחת או יותר מהפעולות הבאות בלי להשפיע לרעה על ביצועי האפליקציה:

  • מפעילים רק את יומני הסיכום.
  • מגדירים את היומנים המלאים לרמה ERROR.
  • שמרו את מזהה הבקשה של בקשות ספציפיות שמעניינות אתכם, כדי שתוכלו לשתף אותו עם ערוצי התמיכה.

מידע נוסף זמין במדריך הרישום ביומן.

החלטה אם להשתמש ב-SearchStream או בשיטת החיפוש

יש שתי דרכים עיקריות לאחזור אובייקטים באמצעות Google Ads API: השיטה Search (שמשתמשת בחלוקה לדפים) והשיטה SearchStream (שמשתמשת בהזרמה).

הביצועים של SearchStream טובים יותר מאלה של Search, אבל יש תרחישים שבהם עדיף להשתמש ב-Search.

מידע נוסף על שתי השיטות זמין במדריך לדיווח על סטרימינג.

שימוש באפשרות ReadyToRun

‫.NET Core 3.1 מוסיף תמיכה בהידור מראש של קבצים בינאריים לפלטפורמה ולארכיטקטורה ספציפיות. כדי לעשות זאת, צריך להגדיר את ההגדרה PublishReadyToRun לערך true, ואז לפרסם את הקובץ הבינארי על ידי ציון ערך תקין של RuntimeIdentifier בזמן הפרסום. מידע נוסף זמין במדריך בנושא התכונה ReadyToRun.

שימוש ב-TieredCompilation

TieredCompilation מאפשר ל-‎ .NET לזהות נקודות חמות ולשפר את הביצועים שלו. האפשרות ReadyToRun מתאימה יותר לשימוש עם קומפילציה מדורגת, כי אפשר להשתמש בתמונה שנוצרה מראש כשהיא זמינה. מידע נוסף זמין במדריך בנושא TieredCompilation.

כוונן את איסוף האשפה שלך (GC)

.NET מספק שני פרופילים כלליים למנגנון איסוף (GC): פרופיל תחנת עבודה ופרופיל שרת. לשני הפרופילים האלה יש הבדלים בביצועים. אפליקציות שמשתמשות בספריית Google Ads .NET נוטות להניב ביצועים טובים יותר כשהן פועלות בפרופיל שרת. כדאי לכם לשנות את ההגדרות הבאות של GC.

  • איסוף פסולת בשרת: איסוף פסולת בשרת מאפשר לזמן ריצה של .NET לספק ביצועים טובים יותר לאפליקציית Google Ads API על ידי פעולה על מספר הליכים. פרטים נוספים זמינים במדריך הזה. ניתן להפעיל את איסוף האשפה של השרת על ידי הוספת השורות הבאות לקובץ .csproj של האפליקציה שלך.

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • איסוף אשפה בו-זמני: ניתן להפעיל את האפשרות איסוף אשפה בו-זמני כדי לתת ל-.NET GC רצף ייעודי לאיסוף אשפה בדור 2. ההגדרה הזו יכולה להיות שימושית כשמעבדים דוחות גדולים. כדי להפעיל מנגנון איסוף מקביל, מוסיפים את השורות הבאות לקובץ .csproj של האפליקציה.

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • שמירת מנגנון איסוף של VM: ההגדרה RetainVMGarbageCollectionקובעת אם פלחי זיכרון וירטואלי שצריך למחוק יועברו לרשימת המתנה לשימוש עתידי, או יוחזרו למערכת ההפעלה (OS). כדי להפעיל שמירה של זיכרון וירטואלי, מוסיפים את השורות הבאות לאפליקציה.

    <PropertyGroup>
      <RetainVMGarbageCollection>true</RetainVMGarbageCollection>
    </PropertyGroup>
    

אתם יכולים לכוונן את ה-GC על ידי הגדרה שתהיה בין תחנת עבודה לבין שרת. כל ההגדרות הרלוונטיות מצוינות בקובץ runtimeconfig.json של אפליקציית .NET Core, במשתנה סביבה או בקובץ App.config של אפליקציית .NET SDK.