ประสิทธิภาพของแอปพลิเคชัน

ไลบรารีของไคลเอ็นต์ .NET ของ Google Ads ช่วยลดความซับซ้อนในการโต้ตอบของแอปกับ Google Ads API โดยมีการกำหนดค่าเพียงเล็กน้อยในส่วนของคุณ อย่างไรก็ตาม ประสิทธิภาพโดยรวมจะขึ้นอยู่กับวิธีใช้ไลบรารีและการผสานรวมกับแอปของคุณเป็นอย่างมาก

คู่มือนี้ครอบคลุมการเพิ่มประสิทธิภาพที่เจาะจงสำหรับแอป .NET และเสริมแนวทางปฏิบัติแนะนำที่ใช้ได้กับ Google Ads API โดยทั่วไป

ใช้ GoogleAdsClient ซ้ำทุกครั้งที่ทำได้

GoogleAdsClient แสดงถึงเซสชันของผู้ใช้เมื่อทำการเรียก API โดยจะให้การเพิ่มประสิทธิภาพต่างๆ เช่น

  • การแคชแชแนล gRPC ที่บริการ API ใช้ ซึ่งจะช่วยลดเวลาในการตั้งค่าเมื่อทำการเรียก API ครั้งแรก
  • ใช้โทเค็นเพื่อการเข้าถึงซ้ำเมื่อเป็นไปได้ ซึ่งจะช่วยลดจำนวนรอบที่ไลบรารีของไคลเอ็นต์ Google Ads .NET ต้องดำเนินการเพื่อรีเฟรชโทเค็นเพื่อการเข้าถึง

ใช้โทเค็นเพื่อการเข้าถึงจากบัญชีระดับผู้จัดการเมื่อเป็นไปได้

หากมีโทเค็นเพื่อการเข้าถึงที่ออกในระดับบัญชีดูแลจัดการ คุณจะใช้โทเค็นดังกล่าวเพื่อเรียก API กับบัญชีลูกค้า Google Ads ทั้งหมดภายใต้ลำดับชั้นของบัญชีนั้นได้ เมื่อรวมกับการนำอินสแตนซ์ GoogleAdsClient มาใช้ซ้ำ วิธีนี้จะช่วยลดจำนวนรอบการไป-กลับที่ไลบรารีของไคลเอ็นต์ต้องดำเนินการเพื่อรีเฟรชโทเค็นเพื่อการเข้าถึงได้อีก

ใช้ SearchStream แทน Search หากเป็นไปได้

Google Ads API มีวิธีหลัก 2 วิธีในการดึงข้อมูลออบเจ็กต์ ได้แก่ GoogleAdsService.Search (ซึ่งใช้การแบ่งหน้า) และ GoogleAdsService.SearchStream (ซึ่งใช้สตรีมมิง)

แม้ว่า Search จะส่งคำขอที่มีการแบ่งหน้าหลายรายการเพื่อดาวน์โหลดรายงานทั้งหมด แต่ SearchStream จะส่งคำขอเดียวและเริ่มการเชื่อมต่อแบบถาวรกับ Google Ads API ไม่ว่ารายงานจะมีขนาดเท่าใดก็ตาม โดยทั่วไปแล้ว SearchStream จะมีประสิทธิภาพดีกว่าการแบ่งหน้า เนื่องจากช่วยลดเวลาในการส่งข้อมูลไปกลับในเครือข่ายที่จำเป็นสำหรับการขอหน้าเว็บแต่ละหน้าของการตอบกลับ Search ดูคู่มือการสตรีมรายงานเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับกรณีที่ควรเลือกแต่ละวิธี

จัดการการรีเฟรชโทเค็นเพื่อการเข้าถึงด้วยตนเอง

ในสภาพแวดล้อมแบบไม่เก็บสถานะบางอย่าง เช่น Google Cloud Functions คุณอาจนำอินสแตนซ์ GoogleAdsClient มาใช้ซ้ำในการเรียกใช้ไม่ได้ สภาพแวดล้อมดังกล่าวมีแนวทางปฏิบัติแนะนำของตนเองในการเก็บรักษาและนำข้อมูลกลับมาใช้ใหม่

ใน Google.Ads.GoogleAds v27.0.0 และเวอร์ชันที่ใหม่กว่า คุณสามารถแทรกอินสแตนซ์ ICredential ที่กำหนดค่าไว้ล่วงหน้าของคุณเองลงใน GoogleAdsConfig ได้โดยตรงโดยใช้พร็อพเพอร์ตี้ Credentials และปิดใช้การแคชแชแนล (UseChannelCache = false)

หากต้องการรวมการสร้างข้อมูลเข้าสู่ระบบไว้ในคลาสการกำหนดค่าที่กำหนดเอง (หรือใช้ไลบรารีเวอร์ชันก่อนหน้า) คุณสามารถขยายคลาส GoogleAdsConfig เพื่อรีเฟรชโทเค็นเพื่อการเข้าถึงของคุณเองได้ดังนี้

// Create your own config class by extending the GoogleAdsConfig class.
class MyGoogleAdsConfig : GoogleAdsConfig
{
    public MyGoogleAdsConfig() : base()
    {
        // Disable the library's built-in channel caching mechanism.
        UseChannelCache = false;
    }

    protected override ICredential CreateCredentials()
    {
        // Create your own ICredential object here. You may refer to the
        // default implementation of GoogleAdsConfig.CreateCredentials
        // for an example.
    }
}

// Use your own config class when initializing the GoogleAdsClient instance.
MyGoogleAdsConfig myConfig = new MyGoogleAdsConfig();
GoogleAdsClient client = new GoogleAdsClient(myConfig);

คอมไพล์สำหรับบิลด์ที่เผยแพร่

ตรวจสอบว่าคุณคอมไพล์แอปโดยใช้การกำหนดค่ารุ่นเมื่อติดตั้งใช้งานในเซิร์ฟเวอร์ เมื่อใช้การกำหนดค่าการแก้ไขข้อบกพร่อง แอปจะคอมไพล์ด้วยข้อมูลการแก้ไขข้อบกพร่องเชิงสัญลักษณ์แบบเต็มและไม่มีการเพิ่มประสิทธิภาพคอมไพเลอร์

ทำโปรไฟล์แอป

สร้างโปรไฟล์แอปทั้งสำหรับการใช้งาน CPU และหน่วยความจำเพื่อระบุคอขวดด้านประสิทธิภาพ Visual Studio มีเครื่องมือวินิจฉัยเพื่อช่วยสร้างโปรไฟล์แอป นอกจากนี้ยังมีเครื่องมือสร้างโปรไฟล์เชิงพาณิชย์อื่นๆ ที่พร้อมใช้งานด้วย

ใช้เมธอดแบบไม่พร้อมกัน

การเขียนโปรแกรมแบบอะซิงโครนัสโดยใช้กระบวนทัศน์ async-await ช่วยหลีกเลี่ยงปัญหาคอขวดด้านประสิทธิภาพและเพิ่มการตอบสนองโดยรวมของแอป ไลบรารี .NET ของ Google Ads จะสร้างเมธอดแบบอะซิงโครนัสสําหรับบริการและเมธอด RPC ทั้งหมด

การยกเลิกเมธอดแบบไม่พร้อมกัน

คุณสามารถใช้พารามิเตอร์ callSettings เพื่อส่ง CancellationToken ไปยังเมธอดแบบไม่พร้อมกัน เช่น SearchStreamAsync ได้

using 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.V26.GoogleAdsService);

await googleAdsService.SearchStreamAsync(
    request,
    (SearchGoogleAdsStreamResponse resp) =>
    {
        foreach (GoogleAdsRow googleAdsRow in resp.Results)
        {
            // Process the row.
        }
    },
    callSettings);

ปิดการบันทึกเมื่อทำได้

ไลบรารี .NET ของ Google Ads จะปิดการบันทึกโดยค่าเริ่มต้นและใช้แนวทางการบันทึกแบบ Lazy ซึ่งช่วยให้แอปมีประสิทธิภาพดีขึ้น หากเปิดการบันทึกระหว่างการพัฒนาซอฟต์แวร์ โปรดปิดการบันทึกในสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์ หากต้องการตรวจสอบคำขอที่ล้มเหลวโดยเฉพาะในเวอร์ชันที่ใช้งานจริง คุณสามารถทำตามขั้นตอนต่อไปนี้อย่างน้อย 1 ขั้นตอนโดยไม่ส่งผลเสียต่อประสิทธิภาพของแอป

  • เปิดเฉพาะบันทึกสรุป
  • ตั้งค่าบันทึกแบบเต็มเป็นระดับ ERROR
  • บันทึกรหัสคำขอสำหรับคำขอที่ล้มเหลวโดยเฉพาะ เพื่อให้คุณแชร์กับช่องทางการสนับสนุนได้

ดูข้อมูลเพิ่มเติมได้ที่คู่มือการบันทึก

ใช้ตัวเลือก ReadyToRun

.NET สมัยใหม่รองรับการคอมไพล์ไบนารีล่วงหน้าไปยังแพลตฟอร์มและสถาปัตยกรรมที่เฉพาะเจาะจงโดยการตั้งค่า PublishReadyToRun เป็น true จากนั้นเผยแพร่ไบนารีโดยระบุ RuntimeIdentifier ที่ถูกต้อง ดูข้อมูลเพิ่มเติมได้ที่คู่มือการติดตั้งใช้งาน ReadyToRun

ใช้ TieredCompilation

TieredCompilation (เปิดใช้โดยค่าเริ่มต้นในเวอร์ชัน .NET สมัยใหม่ เช่น .NET 8) ช่วยให้ .NET ระบุฮอตสปอตและปรับปรุงประสิทธิภาพรันไทม์ได้ การคอมไพล์แบบแบ่งระดับทำงานได้ดีกับ ReadyToRun เนื่องจากสามารถใช้รูปภาพที่สร้างไว้ล่วงหน้าเพื่อการเริ่มต้นอย่างรวดเร็ว แล้วจึงคอมไพล์เมธอดที่ใช้บ่อยใหม่ด้วยการเพิ่มประสิทธิภาพอย่างเต็มรูปแบบ ดูข้อมูลเพิ่มเติมได้ที่คู่มือ TieredCompilation

ปรับแต่งการจัดการหน่วยความจำที่ไม่ใช้แล้ว (GC)

.NET มีโปรไฟล์ทั่วไป 2 โปรไฟล์สำหรับการเก็บขยะ (GC) ได้แก่ โปรไฟล์เวิร์กสเตชันและโปรไฟล์เซิร์ฟเวอร์ โปรไฟล์ทั้ง 2 แบบนี้มีข้อดีข้อเสียด้านประสิทธิภาพที่แตกต่างกัน แอปเซิร์ฟเวอร์เฉพาะที่ใช้ไลบรารี .NET ของ Google Ads มักจะมีประสิทธิภาพดีกว่าเมื่อทำงานในโปรไฟล์เซิร์ฟเวอร์

คุณจะได้รับประโยชน์จากการปรับแต่งการตั้งค่า GC ต่อไปนี้

  • การเก็บขยะของเซิร์ฟเวอร์: การเก็บขยะของเซิร์ฟเวอร์ช่วยให้รันไทม์ .NET มีอัตราการส่งข้อมูลที่สูงขึ้นไปยังแอป Google Ads API โดยทำงานบนฮีปและเธรด GC หลายรายการ ดูรายละเอียดเพิ่มเติมได้ที่คู่มือ GC ของเซิร์ฟเวอร์ คุณเปิดการเก็บขยะของเซิร์ฟเวอร์ได้โดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ .csproj ของแอป

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • การจัดการหน่วยความจำที่ไม่ใช้แล้วพร้อมกัน: คุณสามารถเปิดการจัดการหน่วยความจำที่ไม่ใช้แล้วพร้อมกันเพื่อให้ .NET GC มีเทรดเฉพาะสำหรับการจัดการหน่วยความจำที่ไม่ใช้แล้วในรุ่นที่ 2 การตั้งค่านี้จะมีประโยชน์เมื่อประมวลผลรายงานขนาดใหญ่ คุณเปิดการเก็บขยะพร้อมกันได้โดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ .csproj ของแอป

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • คงการเก็บขยะ VM: การตั้งค่า RetainVMGarbageCollection จะกำหนดค่าว่าจะนำส่วนของหน่วยความจำเสมือนที่ควรลบไปไว้ในรายการสแตนด์บายเพื่อใช้ในอนาคต หรือจะปล่อยกลับไปยังระบบปฏิบัติการ (OS) คุณสามารถเปิดการเก็บรักษาหน่วยความจำเสมือนได้โดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ .csproj ของแอป

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

คุณสามารถปรับแต่ง GC ได้โดยเลือกการตั้งค่าที่สร้างสมดุลระหว่างลักษณะการทำงานของเวิร์กสเตชันและเซิร์ฟเวอร์ คุณสามารถระบุการตั้งค่า GC ที่เกี่ยวข้องทั้งหมดได้ในไฟล์ runtimeconfig.json ของแอป .NET ผ่านตัวแปรสภาพแวดล้อม หรือใน App.config