يسرد هذا المستند أفضل الممارسات لتحسين أداء النصوص البرمجية.
تقليل عدد الطلبات إلى الخدمات الأخرى
إنّ استخدام عمليات JavaScript ضمن النص البرمجي أسرع من استدعاء خدمات أخرى. إنّ أي إجراء تنفّذه ضمن "برمجة تطبيقات Google" يكون أسرع من استرداد البيانات من خوادم Google أو خادم خارجي، مثل الطلبات إلى "جداول بيانات Google" و"مستندات Google" و"مواقع Google" و"ترجمة Google" وUrlFetch. ستعمل النصوص البرمجية بشكل أسرع إذا قلّلت عدد طلبات الخدمة.
التعاون باستخدام مساحات التخزين السحابي المشتركة
إذا كنت تعمل على مشروع نص برمجي مع مطوّرين آخرين، يمكنك التعاون باستخدام مساحات التخزين السحابي المشتركة. تمتلك المجموعة الملفات في مساحة التخزين السحابي المشتركة وليس الأفراد، ما يسهّل عملية تطوير المشاريع وصيانتها.
استخدام العمليات المجمّعة
تقرأ النصوص البرمجية عادةً البيانات من جدول بيانات، وتجري عمليات حسابية، وتكتب النتائج مرة أخرى. تستخدم برمجة تطبيقات ميزات تحسين مدمجة، مثل البحث المسبق والتخزين المؤقت للكتابة.
يمكنك زيادة التخزين المؤقت المضمّن إلى أقصى حدّ من خلال تقليل عمليات القراءة والكتابة. تكون عملية التبديل بين أوامر القراءة والكتابة بطيئة. لتسريع تنفيذ البرنامج النصي، اقرأ جميع البيانات في مصفوفة باستخدام أمر واحد، ونفِّذ العمليات على بيانات المصفوفة، واكتب البيانات باستخدام أمر واحد.
تجنَّب التبديل بين عمليات القراءة والكتابة كما هو موضّح في هذا المثال غير الفعّال:
// 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();
}
النص البرمجي غير فعّال لأنّه يتضمّن تكرارًا لـ 10,000 خلية مع عمليات كتابة متتالية. على الرغم من أنّ ذاكرة التخزين المؤقت للكتابة تساعد في ذلك، إلا أنّ تجميع الطلبات أكثر فعالية:
// 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 ثانية، بينما يستغرق تشغيل الرمز الفعّال ثانية واحدة فقط.
تجنُّب المكتبات في النصوص البرمجية التي تتضمّن واجهة مستخدم كثيفة
تُعد المكتبات مفيدة لإعادة استخدام الرموز، ولكنها تزيد من مدة بدء تشغيل النصوص البرمجية. ويكون هذا التأخير ملحوظًا في واجهات المستخدم لخدمة HTML من جهة العميل التي تجري عمليات google.script.run متكررة وقصيرة المدة. استخدِم المكتبات باعتدال في الإضافات وتجنَّبها في النصوص البرمجية التي تجري العديد من طلبات google.script.run.
استخدام خدمة ذاكرة التخزين المؤقت
استخدِم خدمة ذاكرة التخزين المؤقت لتخزين الموارد مؤقتًا بين عمليات تنفيذ النصوص البرمجية. يقلّل التخزين المؤقت من معدّل جلب البيانات. يوضّح المثال التالي كيفية استخدام خدمة "ذاكرة التخزين المؤقت" لتسريع الوصول إلى خلاصة RSS بطيئة.
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 ثانية، ولكن ستكون عمليات الوصول اللاحقة سريعة إلى أن تنتهي صلاحية العنصر.
مجموعات البيانات الكبيرة والحسابات المعقّدة
"جداول بيانات Google" هي أداة فعّالة، ولكن مع زيادة حجم مجموعات البيانات وزيادة تعقيد العمليات الحسابية، قد تواجه مشاكل في الأداء، مثل تأخُّر جدول البيانات وظهور أخطاء IMPORTRANGE وانتهاء مهلة البرنامج النصي.
حالات استخدام قاعدة البيانات
إذا كان جدول البيانات يقترب من الحدّ الأقصى البالغ 10 ملايين خلية أو إذا كان لديك العديد من النماذج المرتبطة (مثل 10 نماذج أو أكثر) وصيغ معقّدة بين أوراق متعددة، ننصحك باستخدام حلّ قاعدة بيانات مخصّص.
- Google Cloud SQL: هي خدمة قواعد بيانات ارتباطية مُدارة بالكامل لقواعد بيانات MySQL وPostgreSQL وخادم SQL. استخدِم خدمة JDBC للاتصال بخدمة Cloud SQL أو قواعد البيانات الخارجية الأخرى، مثل Oracle أو MongoDB (من خلال الجسور المناسبة).
- BigQuery: مستودع بيانات يعمل بدون خادم ويتّسم بإمكانية التوسع بشكل كبير. يمكنك استخدام أوراق البيانات المرتبطة لتحليل مجموعات بيانات BigQuery الكبيرة مباشرةً في "جداول بيانات Google"، أو استخدام خدمة BigQuery للتفاعل مع البيانات من Apps Script.
تحسين أداء الصيغة
يمكن أن يؤدي الاستخدام المكثّف لصيغ معيّنة إلى إبطاء جدول البيانات:
- ARRAYFORMULA: على الرغم من أنّها مفيدة، يمكن أن تكون عمليات حساب
ARRAYFORMULAعلى نطاق واسع مكلفة. - VLOOKUP وOFFSET: يمكن أن تكون هاتان الدالتان بطيئتين عند استخدام مجموعات بيانات كبيرة. ننصحك باستخدام
INDEXوMATCHأو برمجة تطبيقات لإجراء عمليات البحث بكفاءة أكبر في الذاكرة. - IMPORTRANGE: يمكن أن يؤدي الاستخدام المتكرّر للدالة
IMPORTRANGEفي العديد من أوراق البيانات إلى حدوث "أخطاء داخلية" إذا كانت أوراق البيانات المصدر كبيرة أو تحت حمولة كبيرة. يمكن أن يساعد دمج البيانات في مصدر مركزي.
التعامل مع مهلة النص البرمجي
تفرض برمجة تطبيقات حدودًا على وقت التنفيذ (عادةً 6 دقائق لكل عملية تنفيذ، أو 30 دقيقة لبعض حسابات Google Workspace). إذا كان النص البرمجي يتعطّل بشكل متكرّر بسبب تجاوز الحدّ الأقصى لوقت التنفيذ، اتّبِع الخطوات التالية:
- استخدام العمليات المجمّعة: كما هو موضّح في قسم استخدام العمليات المجمّعة، يجب تقليل عدد طلبات البيانات من جداول البيانات والخدمات الأخرى.
- تقسيم المهام: قسِّم المهام الكبيرة إلى أجزاء أصغر يمكن إكمال كل منها في غضون المهلة المحدّدة.
- استخدام المشغّلات للمتابعات: يمكنك إعداد مشغّل قابل للتثبيت يستند إلى الوقت لاستئناف عملية طويلة الأمد. يمكن للبرنامج النصي تخزين حالته الحالية (مثل فهرس الصف الأخير الذي تمت معالجته) باستخدام خدمة الخصائص ومواصلة التنفيذ من تلك النقطة في المرة التالية.