أفضل الممارسات

يسرد هذا المستند أفضل الممارسات التي ستساعدك في تحسين أداء النصوص البرمجية.

تقليل المكالمات إلى الخدمات الأخرى

إنّ استخدام عمليات JavaScript ضمن النص البرمجي أسرع بكثير من الاستدعاء إلى الخدمات الأخرى. إنّ أيّ إجراء يمكنك تنفيذه في Google Apps Script نفسه سيكون أسرع بكثير من إجراء طلبات تحتاج إلى جلب البيانات من خوادم Google أو خادم خارجي، مثل الطلبات المرسَلة إلى "جداول بيانات Google" و"مستندات Google" و"مواقع Google" وTranslate وUrlFetch وما إلى ذلك. سيتم تشغيل النصوص البرمجية بشكل أسرع إذا كان بإمكانك العثور على طرق لتقليل المكالمات التي تجريها النصوص البرمجية لتلك الخدمات.

التعاون باستخدام مساحات التخزين السحابي المشتركة

إذا كنت تعمل على مشروع نصي مع مطوّرين آخرين، يمكنك التعاون في مشاريع "برمجة تطبيقات Google" باستخدام مساحات التخزين السحابي المشتركة. تكون الملفات في مساحة التخزين السحابي المشتركة مملوكة للمجموعة، وليس للأفراد. ويسهّل ذلك تطوير المشروع وصيانته.

استخدام العمليات المجمّعة

تحتاج النصوص البرمجية عادةً إلى قراءة البيانات من جدول بيانات وإجراء عمليات حسابية، ثم كتابة نتائج البيانات في جدول بيانات. تتضمّن لغة "برمجة تطبيقات Google" بعض ميزات التحسين المضمّنة، مثل استخدام ميزة "التخزين المؤقت للنظرة إلى المستقبل" لاسترداد ما يُرجَّح أن يحصل عليه النص البرمجي وميزة "التخزين المؤقت للكتابة" لحفظ ما يُرجَّح ضبطه.

يمكنك كتابة نصوص برمجية للاستفادة إلى أقصى حد من ميزة التخزين المؤقت المضمّنة، وذلك من خلال تقليل عدد عمليات القراءة والكتابة. يُعد التناوب بين أوامر القراءة والكتابة بطيئة. لتسريع نص برمجي، اقرأ جميع البيانات في مصفوفة باستخدام أمر واحد، ثمّ نفِّذ أي عمليات على البيانات في المصفوفة، واكتب البيانات باستخدام أمر واحد.

في ما يلي مثال على استراتيجية لا يجب اتّباعها أو استخدامها. يستخدم النص البرمجي الرمز البرمجي التالي لضبط ألوان خلفية كل خلية في شبكة جدول بيانات بمقاس 100 x ‏100. وتستخدم دالة باسم getColorFromCoordinates() (غير معروضة هنا) لتحديد اللون الذي سيتم استخدامه في كل خلية:

  // DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
  // FOR DEMONSTRATION ONLY
  var cell = sheet.getRange('a1');
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    for (var x = 0; x < 100; x++) {
      var c = getColorFromCoordinates(xcoord, ycoord);
      cell.offset(y, x).setBackgroundColor(c);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
    SpreadsheetApp.flush();
  }

النص البرمجي غير فعّال: فهو ينتقل بشكلٍ متكرّر في 100 صف و100 عمود، ويكتب بشكلٍ متسلسل في 10,000 خلية. تساعد ذاكرة التخزين المؤقت للكتابة في "برمجة تطبيقات Google" في ذلك، لأنها تفرض كتابة الرجوع باستخدام مسح في نهاية كل سطر. بسبب التخزين المؤقت، يوجد فقط 100 استدعاء لجدول البيانات.

ولكن يمكن تحسين الرمز البرمجي بشكلٍ كبير من خلال تجميع المكالمات. في ما يلي إعادة كتابة يتم فيها قراءة نطاق الخلايا في صفيف يُسمى "الألوان"، ويتم تنفيذ عملية تحديد اللون على البيانات في الصفيف، ويتم كتابة القيم في الصفيف في جدول البيانات:

  // OKAY TO USE THIS EXAMPLE or code based on it.
  var cell = sheet.getRange('a1');
  var colors = new Array(100);
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    colors[y] = new Array(100);
    for (var x = 0; x < 100; x++) {
      colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
  }
  sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);

يستغرق تشغيل الرمز البرمجي غير الفعّال حوالي 70 ثانية. يتم تشغيل التعليمات البرمجية الفعالة في ثانية واحدة فقط!

تجنُّب المكتبات التي تتضمن نصوصًا برمجية مليئة بواجهة المستخدم

المكتبات هي طريقة ملائمة لإعادة استخدام الرموز البرمجية، ولكنّها تزيد قليلاً من الوقت الذي يستغرقه بدء النص البرمجي. لا يكون هذا التأخير ملحوظًا في النصوص البرمجية التي تستغرق وقتًا طويلاً نسبيًا (مثل نص برمجي لأداة لتنظيف ملفات Google Drive)، ولكن بالنسبة إلى واجهات مستخدم خدمة HTML من جهة العميل التي تُجري مكالمات متكررة وgoogle.script.run قصيرة، سيؤثّر التأخير في كل مكالمة. وبسبب هذه المشكلة، يجب استخدام المكتبات باعتدال في الإضافات، كما ننصحك بتجنُّبها في النصوص البرمجية غير الإضافية التي تُجري الكثير من طلبات google.script.run.

استخدام خدمة ذاكرة التخزين المؤقت

يمكنك استخدام خدمة ذاكرة التخزين المؤقت لتخزين الموارد مؤقتًا بين عمليات تنفيذ النصوص البرمجية من خلال الاحتفاظ بالبيانات في ذاكرة التخزين المؤقت، يمكنك تقليل عدد المرات أو معدّل تكرار جلب البيانات. لنفترض أنّ لديك خلاصة RSS على example.com تستغرق 20 ثانية لعرضها، وأنّك تريد تسريع الوصول إلى الخلاصة في المتوسط. يوضّح المثال أدناه كيفية استخدام "خدمة ذاكرة التخزين المؤقت" لتسريع الوصول إلى هذه البيانات.

  function getRssFeed() {
    var cache = CacheService.getScriptCache();
    var cached = cache.get("rss-feed-contents");
    if (cached != null) {
      return cached;
    }
    // This fetch takes 20 seconds:
    var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
    var contents = result.getContentText();
    cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
    return contents;
  }

في الوقت الحالي، عليك الانتظار لمدة 20 ثانية إذا لم يكن العنصر مخزّنًا مؤقتًا، ولكن ستكون عمليات الوصول اللاحقة سريعة جدًا إلى أن تنتهي صلاحية العنصر في ذاكرة التخزين المؤقت بعد 25 دقيقة.