مرحبا. اسمي ستاس ، في Domclick ، أشرف على تطوير خدمات المكتب الخلفي لإقراض الرهن العقاري في سبيربنك.
في الآونة الأخيرة ، في جميع أنواع التقارير والبودكاست ، غالبًا ما صادفت مصطلح "الرمز الأخضر". بعد البحث على الإنترنت ودراستي لهذا الموضوع ، أدركت أن هذا المصطلح يصف مجموعة من التقنيات في تطوير وتصميم التطبيقات التي يمكن أن تقلل من استهلاك الطاقة للمعدات التي يتم تنفيذ هذا الرمز عليها.
غالبًا ما يكون هذا السؤال محيرًا من قِبل مطوري تطبيقات الهاتف المحمول ، ويرجع ذلك أساسًا إلى أن الجهاز الذي سيتم تنفيذ التعليمات البرمجية الخاصة به له سعة بطارية محدودة.
لقد أصبح الموضوع "ضجيجًا" تمامًا ، وقررت أن أكتشف بالضبط كيف يمكن أن تنعكس مبادئ "الأخضر" في تطوير الويب.
المبادئ الأساسية لكتابة "الرمز الأخضر"
بعد قراءة الكثير من التقارير والمقالات حول هذا الموضوع ، أود أن أبرز الجوانب التالية لتطوير التطبيقات التي تؤثر على استهلاك الطاقة:
1) تبسيط وتحسين الخوارزميات
كما ذكر أعلاه ، يجب أن يؤدي تنفيذ الكود إلى الحد الأدنى من استهلاك الطاقة. سيتم تنفيذ الكود المحسن بشكل أسرع ، وبالتالي ، سيتطلب تكاليف معالجة وتبريد أقل للمعدات.
دعنا نحاول حساب الفرق في استهلاك الطاقة لتنفيذ عملية محددة في الكود - الفرز الكلاسيكي للقائمة. سأبالغ عمدًا في الموقف في المثال المعطى لإظهار الاختلاف في مزيد من التباين.
لنأخذ نوع الفقاعة. ربما تكون هذه واحدة من أكثر الطرق دون المستوى الأمثل. مناسب جدا لنا. دعنا نحسب فرز القائمة ونرى كيف أثرت على استهلاك الطاقة لجهاز MacBook. أولاً ، لنحاكي مصفوفة البيانات ومنطق فرز الفقاعة نفسه:
from random import randint
def bubble(array):
for i in range(productNumber-1):
for j in range(productNumber-i-1):
if array[j] > array[j+1]:
buff = array[j]
array[j] = array[j+1]
array[j+1] = buff
productNumber = 60000
products = []
for i in range(productNumber):
products.append(randint(1, 1000))
bubble(products)
print(products)
لقياس تأثير تنفيذ الكود على استهلاك الطاقة ، استخدمت نظام مراقبة iStat Menus 6 (https://bjango.com/mac/istatmenus/). لقد قمت بتوصيل جهاز MacBook الخاص بي بالشبكة ، وأغلقت جميع تطبيقات الجهات الخارجية ، وانتظرت بعض الوقت لشحن البطارية ، وبدأت في الفرز:
الرسم البياني
لاستهلاك الطاقة عند إجراء فرز الفقاعات: يمكن رؤية قفزة واضحة في استهلاك الطاقة تدوم 305 ثانية. كان سببه تنفيذ طلبنا غير الأمثل. بالإضافة إلى ذلك ، الطاقة المستهلكة لمدة 5 دقائق (305 ثانية)
P = (W2 – W1) × 305 = (17,29 [ ] – 2,9 [ ]) × 305 = 14,39 × 305 = 4389 = 0,0012 * .
لنفترض الآن أن هذا الرمز وصل بطريق الخطأ إلى خادم منتج صناعي (لنفترض أن استهلاك الطاقة الإضافي على الخادم سيكون هو نفسه على جهاز MacBook الخاص بي ، والاعتماد متناسب بشكل مباشر) وبدأ تنفيذه بتردد 1 كل 10 ثوانٍ. ثم في السنة نحصل على المزيد من الطاقة:
365 × 24 × 3600 /10 × 0,0012 * = 3 784,32 *.
افترض أن مركز البيانات الذي يستضيف الخادم يتلقى الطاقة من غرفة مرجل تستخدم خشب البتولا كوقود. عند حرق 1 م 3 من خشب البتولا ، يتم تحرير 1900 kW * h / m 3 من الطاقة. بطبيعة الحال، فإن كفاءة المراجل ليست 100٪، وإذا أخذنا ذلك 75٪، نحصل على: . إذا أخذنا شجرة كأسطوانة عادية ، يكون حجمها
(3 784,32 / 1900) / 0,75 = 2,66 3
V = Pi × R2 × H
حيث R هو نصف قطر جذع الشجرة ، لنأخذها على أنها 0.12 متر (متوسط القيمة) ،
H هي ارتفاع جذع الشجرة ، لنأخذها على أنها 3 أمتار (القيمة المتوسطة).
ثم نحصل على: هذا يعني أنه سيكون هناك خشب في متر مكعب واحد . نحن بحاجة إلى عام لتشغيل السيناريو الخاص بنا . للمقارنة ، أجريت نفس الفرز باستخدام طريقة فرز Python القياسية ( ). الرسم البياني لاستهلاك الطاقة عند إجراء الفرز القياسي في Python: بتطبيق نفس منطق الحساب (كانت مدة الذروة 10 ثوانٍ) ، نحصل على: في عام نحصل عليه (بافتراض أن العملية تتم مرة كل 10 ثوانٍ) أو:
V = 3,14 × 0,0144 × 3 = 0,14 3
1 / 0,14 = 7,14
2,66 3 × 7,14 = 19
.sort()
P = (W2 – W1) × 10 = (3,51 [ ] – 2,9 [ ]) × 10 = 6,1 = 0,0000016 *
365 × 24 × 3600 /10 × 0,0000016 * = 5,05 *
5,05 / 1900 / 0,75 × 7,14 = 0,025 .
بالطبع ، يحتوي هذا المثال على الكثير من الافتراضات ، ونادرًا ما يتم إجراء نوع الفقاعة. لكن الأرقام الناتجة بدت مثيرة للاهتمام بالنسبة لي
2) استخدم نموذج التطبيق الذي يحركه الحدث كلما أمكن ذلك
النقطة المهمة هي أن معظم المعالجات تدعم "حالات" متعددة لاستهلاك الطاقة. في حالة عدم انشغال النواة بأي عمليات حسابية ، يضعها نظام التشغيل في حالة "السكون" ، حيث يستهلك المعالج طاقة أقل بكثير.
طيف الحالات (تحسين الطاقة):
يمكنك قراءة المزيد عن هذا هنا .
في كثير من الأحيان ، هناك موقف يجب فيه تنفيذ بعض منطق التطبيق عند حدوث حدث معين. ومن أجل معرفة أن هذا الحدث قد حدث ، غالبًا ما تقوم الخدمة المهتمة بالحصول على هذه المعلومات باستطلاعات دورية للخدمة التي تخزن حقيقة تنفيذ هذا الحدث. بواسطة الموقت. علاوة على ذلك ، تتلقى الغالبية العظمى من الطلبات إجابة سلبية ، أي أن 99٪ من الطلبات ، في الواقع ، ليست مطلوبة.
سيكون من الصحيح بث الحدث المقابل لقائمة الانتظار وقراءة حقيقة حدوثه لجميع الخدمات المهتمة.
طيف الدول (تحسين الطاقة):

مثال آخر هو تفاعل مكونات التطبيق الأمامية والخلفية. إذا احتاجت الواجهة إلى تغيير حالتها اعتمادًا على البيانات الموجودة في قاعدة البيانات ، في بعض الأحيان يتم إرسال الطلبات بشكل دوري إلى الواجهة الخلفية ، مما يؤدي إلى إنشاء حمل إضافي غير ضروري. على الرغم من أنه من الممكن إبلاغ الجبهة عن تغيير في حالة البيانات الضرورية من خلال خادم المقبس.
بينما يمكن أن يكون هناك خطأ في المقابس أيضًا ، فإليك مثال على الشفرة "السيئة":
while(true)
{
// Read data
result = recv(serverSocket, buffer, bufferLen, 0);
// Handle data
if(result != 0)
{
HandleData(buffer);
}
// Sleep and repeat
Sleep(1000);
}
يمكن ملاحظة أنه حتى في حالة عدم وصول أي بيانات إلى المقبس ، فسيظل تنفيذ الكود كل 1000 ثانية ، مما يؤدي إلى إهدار الطاقة الثمينة.
يمكن كتابة الشيء نفسه بشكل مختلف قليلاً ، وسيتم إنفاق طاقة أقل:
WSANETWORKEVENTS NetworkEvents;
WSAEVENT wsaSocketEvent;
wsaSocketEvent = WSACreateEvent();
WSAEventSelect(serverSocket,
wsaSocketEvent, FD_READ|FD_CLOSE);
while(true)
{
// Wait until data will be available in
the socket
WaitForSingleObject(wsaSocketEve
nt, INFINITE);
// Read data
result = recv(serverSocket, buffer,
bufferLen, 0);
// Handle data
if(result != 0)
{
HandleData(buffer);
}
}
3) UI/UX: «»
إذا كانت البيانات لا تزال مستخدمة ، ولكن نادرًا ، فمن الأفضل عدم عرضها افتراضيًا ، ولكن إظهارها فقط بالنقر فوق الزر "إظهار المعلومات التفصيلية".
مثال بسيط يوضح هذا المبدأ: عرض قوائم كائنات البيانات (الطلبات ، المستخدمين ، منافذ البيع بالتجزئة ، المستودعات ، المكاتب) ، بشرط أن السيناريو الخاص باستخدام النموذج لا يزال ينطوي على العثور على الكائن المطلوب.
مثال لواجهة سيئة :
تعرض الصفحة قائمة ضخمة من المهام (مقسمة إلى "صفحات") ، لكن المستخدم سيظل يبحث عن عميل معين (وفقًا لبعض المنطق في رأسه) في شريط البحث في الأعلى. لماذا تهدر الموارد الحصول على قائمة مهام؟
نفس السيناريو تم تنفيذه بطريقة مختلفة:
مثال على واجهة "خضراء" :
تم نقل منطق اختيار العميل إلى النظام ؛ افتراضيًا ، لا يتم طلب البيانات غير الضرورية "خارج العادة". هذا الخيار ، بالإضافة إلى دعاة حماية البيئة ، والأمن السيبراني سيحظى بثناء شديد.
4) إعادة بناء ديون
إعادة الهيكلة مفيدة دائمًا تقريبًا. ولكن في هذا السياق ، هناك حاجة إلى هدف واحد بسيط: التخلص من الكود غير الضروري (المهملة) أو تبسيط الكود الموجود لتقليل استهلاك الطاقة.
العديد من التطبيقات التي تم تطويرها لأكثر من ثلاث سنوات تتراكم فيها مئات الأسطر من التعليمات البرمجية غير المستخدمة أو التي لا يمكن التنبؤ بها والتي خلفتها وظائف تم تنفيذها مسبقًا (وربما تم قطعها بالفعل). في بعض الأحيان يتم تنفيذ هذا الرمز ، ولكن نتيجة عمله غير مطلوبة.
ستؤدي المراجعة الدورية وإعادة البناء إلى تقليل مقدار هذا الرمز ، على الرغم من أنه ربما لن يتخلص منه تمامًا.
على سبيل المثال ، عند إعادة هيكلة إحدى خدماتنا بانتظام (ضمن الحصة الفنية لساعات العمل) ، وجدنا هذا:
مثال على إعادة البناء :
crm_deal_id- معرف معاملة الرهن في النظام القديم. الآن لم تعد هناك حاجة إليها ، لكن الرمز لا يزال يتحقق للحصول عليه واستدعاء وظيفة إضافية delete_deal_chat_telephonyتؤدي الكثير من الإجراءات الأخرى.
كل هذا يمكن إزالته دون فقدان الوظيفة.
5) استخدم لغات البرمجة منخفضة المستوى للتطبيقات عالية التحميل
من الواضح ، في معظم الحالات ، أن التطبيقات المكتوبة بلغات منخفضة المستوى أكثر كفاءة في استخدام الطاقة. من المنطقي إعادة كتابة خدمة محملة في Python (إذا كانت تؤدي عملية بسيطة) في C / C +. سيكون أسرع وأكثر اخضرارًا.
صحيح ، غالبًا لا نمتلك المعرفة اللازمة لكتابة المنطق بمثل هذه اللغات.
6) عمليات المجموعة I / O
أنظمة التخزين ، مثل المعالجات ، لها أيضًا حالات طاقة مختلفة.
يستهلك وضع السكون طاقة أقل بكثير من وضع التشغيل الدافئ. هذا ينطبق بشكل خاص على أنظمة التخزين / محركات الأقراص الصلبة.
إذا كان بإمكان التطبيق تجميع البيانات المكتوبة على القرص والوصول إلى القرص ليس باستمرار ، ولكن في فترات زمنية معينة ، فسيكون ذلك أكثر كفاءة في استخدام الطاقة ، لأنه خلال فترة "الخمول" سيرسل نظام التشغيل القرص إلى "الإسبات".
7) استخدام أنظمة تخزين أقل استهلاكًا للطاقة للسجلات
من الممارسات الجيدة استخدام التخزين "الساخن" و "البارد". على سبيل المثال ، من المنطقي تخزين جذوع الأشجار للأسبوع الماضي في شكل مفهرس للطهي "الساخن" ، لأن احتمالية الوصول إليها ستكون عالية جدًا. يمكن تخزين السجلات الأطول في أنظمة تخزين أرخص وأقل استهلاكًا للطاقة.
ماذا عن نطاق صناعي؟
أعلاه ، قمنا بتغطية التقنيات الأساسية للعمل مع الكود لضمان كفاءة الطاقة. ولكن حتى اتباع معظم هذه القواعد سيؤدي إلى وفورات متواضعة جدًا يصعب تصورها. بالطبع ، إذا لم يتم فرز القوائم حسب طريقة الفقاعة في المبيعات ، فإن
التطوير الهادف للوظائف لتنفيذ إدارة المستندات الإلكترونية سيعطي تأثيرًا أكبر بكثير.
يتمثل أحد أنشطة فرق Domclick في تحسين وتبسيط عملية الحصول على قرض عقاري. وفي عملية الرهن العقاري هذه في المرحلة النهائية ، يتم إعداد الكثير من المستندات على الورق. وعدة نسخ. نسخة للبائع ونسخة للمشتري ونسخة للملف البنكي.
يسعدني أن أعرف أن Domclick تبذل الكثير من الجهد للقضاء على هذه الممارسة الشريرة ونقل تدفق المستندات بالكامل إلى تنسيق إلكتروني. هذا العام ، تمت بالفعل رقمنة جزء كبير من معاملات الرهن العقاري بالكامل (تمت طباعة ورقة واحدة فقط: تطبيق لإصدار UKEP ، وهو توقيع إلكتروني مشفر محسّن). تم التوقيع على جميع المستندات الأخرى بواسطة UKEP ولم يتم إنفاق أي ورقة عليها.
لقد وفرت هذه المبادرة بالفعل أكثر من 67491108 ورقة. في البتولا ، يوجد حوالي 23000 شجرة!
حماية البيئة!
روابط للمهتمين:
- تكنولوجيا المعلومات الخضراء - البيانات والمبادئ التوجيهية المتاحة لتقليل استهلاك الطاقة في أنظمة تكنولوجيا المعلومات / Ardito L. موريسيو إم ... - في: الحوسبة المستدامة. - ISSN 2210-5379. - ستامبا
- Understanding Green Software Development: A conceptual Framework /Luca Ardito, Giuseppe Procaccianti, Marco Torchiano, Antonio Vetro
- Green SW Engineering:Ideas for including Energy Efficiency into your Softwar Projects/Gerald Kaefer