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

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

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

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

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

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

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

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

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

إليك مثال - مثال يجب عليك عدم اتباعه أو استخدامه. يستخدم البرنامج النصي التعليمة البرمجية التالية لتعيين ألوان الخلفية لكل خلية في شبكة جدول بيانات 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 دقيقة.