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

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

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

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

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

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

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

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

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

إليك مثال — مثال يجب عدم متابعته أو استخدامه. يستخدم البرنامج النصي التعليمة البرمجية التالية لتعيين ألوان الخلفية لكل خلية في شبكة جدول بيانات مقاس 100 × 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 عمود، ويكتب بشكل تدريجي إلى 10000 خلية. تساعد ذاكرة التخزين المؤقت للكتابة في "برمجة تطبيقات 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).setBackgroundColors(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 دقيقة.