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

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

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

إنّ استخدام عمليات 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 دقيقة.