绿色法规和桦木。开发中绿色代码的基本原理





你好。我叫Stas,在Domclick负责Sberbank的抵押贷款后台服务开发。



最近,在各种报告和播客中,我经常遇到“绿色代码”一词。在Internet上翻阅并研究了此主题之后,我意识到该术语描述了应用程序的开发和设计中的一组技术,这些技术可以减少执行此代码的设备的功耗。



移动应用程序开发人员通常会或多或少地迷惑这个问题,主要是因为将在其上执行其代码的设备的电池容量有限。



这个话题已经变得非常“炒作”了,我决定弄清楚“绿色”的原理在WEB开发中如何得到体现。



编写“绿色代码”的基本原理



阅读有关该主题的许多报告和文章之后,我将重点介绍影响功耗的应用程序开发的以下方面:



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上的功耗相同,并且相关性成正比)并开始以每10秒1次的频率执行。那么一年我们获得更多的能量:



365 × 24 × 3600 /10 × 0,0012 * = 3 784,32 *



假设托管服务器的数据中心从使用桦木作为燃料的锅炉房接收电力。燃烧1 m 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秒内执行了1次) 或:



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)将低级编程语言用于高负载应用程序



显然,在大多数情况下,以低级语言编写的应用程序更加节能。在C / C +中用Python重写加载的服务(如果它执行简单的操作)是有意义的。它将更快,更环保。



是的,通常我们没有必要的知识来用这种语言编写逻辑。



6)组I / O操作



像处理器一样,存储系统也具有不同的电源状态。

在“睡眠”模式下,所消耗的能量比在工作“温暖”状态下要少得多。对于存储系统/硬盘驱动器尤其如此。



如果应用程序可以对写入磁盘的数据进行分组并在某个时间段内不固定地访问磁盘,那么它将更加节能,因为在“空闲”期间,操作系统会将磁盘送入“休眠”状态。



7)使用耗电量少的日志存储系统



优良作法是使用“热”和“冷”存储。例如,将上周的日志以“热”烹饪的索引形式存储是有意义的,因为访问日志的可能性非常高。更长的日志可以存储在更便宜,更省电的存储系统中。



在工业规模上怎么样?



上面,我们介绍了使用代码以确保其能效的基本技术。但是,即使遵循这些规则中的大多数规则,也将产生非常适度的节省,这将很难形象化。当然,如果在销售中未按冒泡方法对列表进行排序,则



有目的地开发用于实现电子文档管理的功能将产生更大的效果。



Domclick团队的活动之一是优化和简化获取抵押贷款的过程。在这个抵押过程中,在最后阶段,很多文件都准备在纸上。并分几份。卖方一本,买方一本,银行档案一本。



我很高兴知道Domclick花费了大量的精力来消除这种恶行,并将整个文档流程转换为电子格式。今年,抵押交易的很大一部分已经完全数字化(只打印了一张纸:UKEP发行申请,一种增强的加密电子签名)。其他所有文件均由该UKEP签署,没有花任何纸。



该倡议已经节省了67,491,108张纸。在桦树中,大约有23,000棵树!



保护环境!



有兴趣者的链接:

  1. 绿色IT –减少IT系统能耗的可用数据和指南。Morisio M…-在:可持续计算。-ISSN 2210-5379。-邮票
  2. Understanding Green Software Development: A conceptual Framework /Luca Ardito, Giuseppe Procaccianti, Marco Torchiano, Antonio Vetro
  3. Green SW Engineering:Ideas for including Energy Efficiency into your Softwar Projects/Gerald Kaefer



All Articles