इसके माध्यम से साझा किया गया


कोड अनुकूलन

जैसे-जैसे कैनवास ऐप्स विविध व्यावसायिक आवश्यकताओं को पूरा करने के लिए विकसित होते हैं, इष्टतम प्रदर्शन बनाए रखने की चुनौती एक महत्वपूर्ण विचार बन जाती है। कैनवास ऐप्स के भीतर डेटा प्रबंधन, उपयोगकर्ता इंटरफ़ेस डिज़ाइन और कार्यक्षमता की पेचीदगियों के कारण कोड अनुकूलन के लिए सूक्ष्म दृष्टिकोण की आवश्यकता होती है।

जैसे-जैसे कैनवास ऐप्स अधिक जटिल होते जाते हैं, डेवलपर्स को डेटा पुनर्प्राप्ति, सूत्र जटिलता और रेंडरिंग गति से संबंधित चुनौतियों का सामना करना पड़ता है। मजबूत कार्यक्षमता और उत्तरदायी उपयोगकर्ता इंटरफेस के बीच संतुलन बनाने की आवश्यकता, कोड अनुकूलन के लिए एक व्यवस्थित दृष्टिकोण अपनाने के महत्व को रेखांकित करती है।

Power Fx सूत्र अनुकूलन

फ़ंक्शन के साथ

With फ़ंक्शन एकल रिकॉर्ड के लिए सूत्र का मूल्यांकन करता है. सूत्र, किसी मान की गणना और/या क्रियाएँ कर सकता है, जैसे डेटा संशोधित करना या कनेक्शन के साथ कार्य करना. जटिल सूत्रों को छोटे नामित उप-सूत्रों में विभाजित करके उनकी पठनीयता में सुधार करने के लिए With का उपयोग करें। ये नामित मान, With के दायरे तक सीमित सरल स्थानीय चरों की तरह कार्य करते हैं। संदर्भ या वैश्विक चरों की तुलना में With का उपयोग करना बेहतर है क्योंकि यह स्वयं निहित है, समझने में आसान है, और किसी भी घोषणात्मक सूत्र संदर्भ में इसका उपयोग किया जा सकता है। फ़ंक्शन के बारे में अधिक जानें.With

एक  Power Fx फ़ॉर्मूले का स्क्रीनशॉट जो With फ़ंक्शन का उपयोग करता है

समवर्ती कार्य

Concurrent फ़ंक्शन एक ही गुण के अंतर्गत निर्दिष्ट एकाधिक सूत्रों का एक ही समय में मूल्यांकन करने की अनुमति देता है, यदि उनमें कनेक्टर या Dataverse कॉल हैं। सामान्यतः, एकाधिक सूत्रों का मूल्यांकन उन्हें ; (अर्धविराम) ऑपरेटर के साथ एक साथ जोड़कर किया जाता है, जो प्रत्येक सूत्र का क्रमिक रूप से मूल्यांकन करता है। Concurrent फ़ंक्शन के साथ, ऐप ; ऑपरेटर का उपयोग करने के बाद भी एक प्रॉपर्टी के सभी फ़ॉर्मूलों का समवर्ती रूप से मूल्यांकन करेगा। यह समवर्तीता उपयोगकर्ताओं को समान परिणाम के लिए कम प्रतीक्षा करने में सहायता करती है। जब पिछली कॉल समाप्त होने तक, डेटा कॉल शुरू नहीं होती है, तो ऐप को सभी अनुरोध समय के योग की प्रतीक्षा करनी चाहिए. यदि डेटा कॉल उसी समय शुरू हो जाती हैं, तो ऐप को केवल सबसे लंबे समय के अनुरोध के लिए प्रतीक्षा करनी होती है. फ़ंक्शन के बारे में अधिक जानें.Concurrent

Concurrent(
    ClearCollect(colAccounts1, Accounts),
    ClearCollect(colUsers1, Users),
    ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
    ClearCollect(colEnvVal1, 'Environment Variable Values')
);

कोलेसेस फ़ंक्शन

Coalesce फ़ंक्शन अपने तर्कों का क्रम से मूल्यांकन करता है और पहला मान लौटाता है जो रिक्त या खाली स्ट्रिंग नहीं है। इस फ़ंक्शन का उपयोग रिक्त मान या रिक्त स्ट्रिंग को किसी भिन्न मान से बदलने के लिए करें, लेकिन गैर-रिक्त और गैर-रिक्त स्ट्रिंग मानों को अपरिवर्तित छोड़ दें। यदि सभी तर्क रिक्त या रिक्त स्ट्रिंग हैं, तो फ़ंक्शन रिक्त मान लौटाता है, जिससे कोलेसेस रिक्त स्ट्रिंग को रिक्त मानों में परिवर्तित करने का एक अच्छा तरीका बन जाता है।

उदाहरण के लिए:

If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)

मान 1 और मान 2 का दो बार मूल्यांकन किया जाना आवश्यक है। इस फ़ंक्शन को निम्न प्रकार से कम किया जा सकता है:

Coalesce(value1, value2)

IsMatch फ़ंक्शन

IsMatch फ़ंक्शन यह परीक्षण करता है कि क्या कोई टेक्स्ट स्ट्रिंग किसी पैटर्न से मेल खाती है जिसमें साधारण वर्ण, पूर्वनिर्धारित पैटर्न या नियमित अभिव्यक्ति शामिल हो सकती है। फ़ंक्शन के बारे में अधिक जानें.IsMatch

उदाहरण के लिए, यह सूत्र संयुक्त राज्य अमेरिका सामाजिक सुरक्षा संख्या से मेल खाता है:

IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")

नियमित अभिव्यक्ति का स्पष्टीकरण:

\\d किसी भी अंक (0-9) से मेल खाता है।

{3} निर्दिष्ट करता है कि पूर्ववर्ती अंक पैटर्न (\d) ठीक तीन बार आना चाहिए।

- हाइफ़न वर्ण से मेल खाता है.

{2} निर्दिष्ट करता है कि पूर्ववर्ती अंक पैटर्न (\d) ठीक दो बार आना चाहिए।

{4} निर्दिष्ट करता है कि पूर्ववर्ती अंक पैटर्न (\d) ठीक चार बार आना चाहिए।

IsMatchके अधिक उदाहरण:

IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")

ऐप को ऑनस्टार्ट पर अनुकूलित करें

कैवास ऐप्स के लिए OnStart प्रॉपर्टी ऐप लॉन्च होने पर होने वाली क्रियाओं को परिभाषित करने में महत्वपूर्ण भूमिका निभाती है। यह गुण ऐप डेवलपर्स को वैश्विक आरंभीकरण कार्यों को निष्पादित करने, चर सेट अप करने और उन कार्यों को करने की अनुमति देता है जो ऐप की स्टार्टअप प्रक्रिया के दौरान केवल एक बार होने चाहिए। उत्तरदायी और कुशल कैनवास ऐप्स बनाने के लिए OnStart संपत्ति को समझना और प्रभावी ढंग से उपयोग करना आवश्यक है।

एक अनुशंसित दृष्टिकोण यह है कि चर सेटअप को नामित सूत्रों में स्थानांतरित करके App.OnStart फ़ंक्शन को सुव्यवस्थित किया जाए। नामित सूत्र, विशेष रूप से वे जो ऐप जीवनचक्र के आरंभ में कॉन्फ़िगर किए गए हों, लाभप्रद साबित होते हैं। ये सूत्र डेटा कॉल के आधार पर चरों के आरंभीकरण को संभालते हैं, तथा आपके कोड के लिए अधिक स्वच्छ और व्यवस्थित संरचना प्रदान करते हैं। अधिक जानकारी बड़े और जटिल कैनवास एप्लिकेशन बनाएं - Power Apps | Microsoft Learn.

नोट

OnStart संपत्ति अनिवार्य है। यह कार्य की एक क्रमबद्ध सूची है जिसे पहली स्क्रीन दिखाए जाने से पहले किया जाना आवश्यक है। क्योंकि यह न केवल इस बारे में विशिष्ट है कि क्या किया जाना चाहिए, बल्कि यह भी कि कार्य को क्रम के आधार पर कब किया जाना चाहिए, यह पुनर्क्रमण और विलंबन अनुकूलन को सीमित करता है जो अन्यथा किया जा सकता था।

स्क्रीन चालू करें

यदि App.OnStart में Navigate फ़ंक्शन कॉल शामिल है, भले ही वह If फ़ंक्शन में हो और शायद ही कभी कॉल किया जाता हो, हमें ऐप का निष्पादन पूरा करना होगा। OnStart इससे पहले कि हम ऐप की पहली स्क्रीन दिखाएं।  App.StartScreen यह यह इंगित करने का नया घोषणात्मक तरीका है कि कौन सी स्क्रीन पहले दिखाई जानी चाहिए, जो अनुकूलन को अवरुद्ध नहीं करता है।

StartScreen संपत्ति सेट करने से App.OnStart पूरा होने से पहले पहली स्क्रीन दिखाई देती है। App.StartScreen declares बिना किसी प्रीप्रोसेसिंग की आवश्यकता के कौन सी स्क्रीन ऑब्जेक्ट को पहले दिखाना है।

इस तरह का कोड लिखने के बजाय:

App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))

कोड को इस प्रकार बदलें:

App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)

अधिक जानकारी के लिए <https://Power Apps.microsoft.com/en-us/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart/> देखें।

चेतावनी

StartScreen और के बीच निर्भरता से बचें OnStart. किसी नामित सूत्र को संदर्भित करना जो बदले में एक वैश्विक चर को संदर्भित करता है, एक रेस स्थिति उत्पन्न कर सकता है जिसमें StartScreen सही ढंग से लागू नहीं होता है। नोट: हमें StartScreen और OnStart के बीच निर्भरता नहीं रखनी चाहिए। हम StartScreen में वैश्विक चरों को संदर्भित करने पर रोक लगाते हैं, लेकिन हम एक नामित सूत्र को संदर्भित कर सकते हैं, जो बदले में एक वैश्विक चर को संदर्भित करता है, और इससे रेस स्थिति उत्पन्न हो सकती है जिसमें StartScreen सही ढंग से लागू नहीं होता है।

नामित सूत्र

नामित सूत्र स्थिर या स्थिरांक होते हैं जिन्हें App.Formulas अनुभाग पर परिभाषित किया जा सकता है। एक बार App.Formulas में घोषित किए जाने के बाद, उनका उपयोग ऐप में कहीं भी किया जा सकता है और उनका मूल्य हमेशा अद्यतन रहता है। Power Apps में नामित सूत्र उन मानों या मानों के सेटों की परिभाषा को सक्षम करते हैं जिन्हें प्लेटफ़ॉर्म द्वारा स्वचालित रूप से प्रबंधित और अद्यतन किया जाता है। यह कार्यक्षमता मूल्य गणना और रखरखाव की जिम्मेदारी डेवलपर से हटाकर उसे सौंप देती है, जिससे विकास प्रक्रिया सुव्यवस्थित हो जाती है। Power Apps Power Apps में नामित सूत्र एक शक्तिशाली कार्यक्षमता है जो ऐप के प्रदर्शन और रखरखाव को महत्वपूर्ण रूप से बढ़ा सकती है।

नामित फ़ार्मुलों का उपयोग ऐप थीम घोषित करने में भी किया जा सकता है। कई मामलों में जहां एंटरप्राइज़ ऐप्स बनाए जाते हैं, हम चाहते हैं कि ऐप में एक समान थीम हो ताकि एक समान लुक और उपयोगकर्ता अनुभव मिल सके। थीम बनाने के लिए, ऐप ऑनस्टार्ट पर 10 से 100 तक वेरिएबल्स घोषित करने की आवश्यकता होती है। इससे ऐप की कोड लंबाई और आरंभीकरण समय बढ़ गया।

आधुनिक नियंत्रण भी थीमिंग में महत्वपूर्ण रूप से मदद कर सकते हैं तथा थीमिंग को संभालने के लिए ग्राहक द्वारा लिखे गए तर्क को कम करने में मदद कर सकते हैं। आधुनिक नियंत्रण अभी पूर्वावलोकन में हैं।

उदाहरण के लिए, App.OnStart पर मौजूद निम्नलिखित कोड को App.Formulas पर ले जाया जा सकता है, जिससे वैश्विक चर घोषणाओं पर स्टार्टअप समय कम हो जाता है।

Set(BoardDark, RGBA(181,136,99, 1));
Set(BoardSelect, RGBA(34,177,76,1));
Set(BoardRowWidth, 10);                      // expected 8 plus two guard characters for regular expressions.
Set(BoardMetadata, 8 \* BoardRowWidth + 1);   // which player is next, have pieces moved for castling rules, etc.
Set(BoardBlank, "----------------------------------------------------------------\_00000000000000");
Set(BoardClassic, "RNBQKBNR\_\_PPPPPPPP------------------------\_--------\_\_pppppppp\_\_rnbqkbnr\_\_0000000000");

कोड को App.Formulas में निम्नानुसार स्थानांतरित किया जा सकता है:

BoardSize = 70;
BoardLight = RGBA(240,217,181, 1);
BoardDark = RGBA(181,136,99, 1);
BoardSelect = RGBA(34,177,76,1);
BoardRowWidth = 10;                      // expected 8 plus two guard characters for regular expressions
BoardMetadata = 8 \* BoardRowWidth + 1;   // which player is next, have pieces moved for castling rules, etc.
BoardBlank = "----------------------------------------------------------------\_00000000000000";
BoardClassic = "RNBQKBNR\_\_PPPPPPPP------------------------\_--------\_\_pppppppp\_\_rnbqkbnr\_\_0000000000";

एक अन्य उदाहरण इन सेटिंग Lookups है। यहां, Office 365 के बजाय Dataverse से उपयोगकर्ता जानकारी प्राप्त करने के लिए लुकअप सूत्र में परिवर्तन आवश्यक है। सभी जगह कोड बदले बिना केवल एक ही स्थान पर परिवर्तन की आवश्यकता है।

UserEmail = User().Email;
UserInfo = LookUp(Users, 'Primary Email' = User().Email);
UserTitle = UserInfo.Title;
UserPhone = Switch(UserInfo.'Preferred Phone', 'Preferred Phone (Users)'.'Mobile Phone', UserInfo.'Mobile Phone',
UserInfo.'Main Phone');

ये सूत्र गणना का सार प्रस्तुत करते हैं। वे अन्य मूल्यों के आधार पर UserEmail, UserInfo, UserTitle, और UserPhone निर्धारण की प्रक्रिया को स्पष्ट करते हैं। यह तर्क समाहित है, जिससे पूरे ऐप में इसका व्यापक उपयोग संभव है, तथा इसे किसी एक स्थान पर संशोधित किया जा सकता है। अनुकूलनशीलता, ऐप में फैले सूत्रों में परिवर्तन किए बिना, उपयोगकर्ता तालिका से कनेक्टर तक स्विच करने तक विस्तारित होती है। Dataverse Office 365

दूसरा दृष्टिकोण अनुकूलन करना है। countRows

varListItems = CountRows(SampleList)

Set फ़ंक्शन के साथ, चर varListItems को नमूना सूची में पंक्तियों की प्रारंभिक गणना के साथ आरंभ करना होगा और सूची आइटम जोड़े जाने या हटाए जाने के बाद फिर से सेट करना होगा। नामित सूत्रों के साथ, जैसे ही डेटा बदलता है, varListitems चर स्वचालित रूप से अपडेट हो जाते हैं।

App.Formulas संपत्ति में नामित सूत्र पूरे ऐप में मूल्यों और गणनाओं के प्रबंधन के लिए अधिक लचीला और घोषणात्मक दृष्टिकोण प्रदान करते हैं, जो केवल App.OnStart पर निर्भर रहने की तुलना में समय की स्वतंत्रता, स्वचालित अपडेट, रखरखाव और अपरिवर्तनीय परिभाषाओं के संदर्भ में लाभ प्रदान करते हैं।

पहलू नामित सूत्र (App.Formulas) ऐप.ऑनस्टार्ट
समय की स्वतंत्रता सूत्र तुरन्त उपलब्ध हैं, किसी भी क्रम में गणना की जा सकती है। चरों के कारण समय पर निर्भरता उत्पन्न हो सकती है, जिससे उपलब्धता प्रभावित हो सकती है।
स्वचालित अद्यतन निर्भरताएँ बदलने पर सूत्र स्वचालित रूप से अद्यतन हो जाते हैं। स्टार्टअप के दौरान वेरिएबल्स एक बार सेट किए जाते हैं; मैन्युअल अपडेट की आवश्यकता हो सकती है।
अनुरक्षण एक स्थान पर केन्द्रीकृत सूत्र रखरखाव में सुधार करते हैं। बिखरे हुए चरों को अनेक स्थानों पर खोजने और अद्यतन करने की आवश्यकता हो सकती है।
अपरिवर्तनीय परिभाषाएँ App.Formulas में सूत्र परिभाषाएँ अपरिवर्तनीय हैं. परिवर्तनशील मानों में आकस्मिक परिवर्तन हो सकता है।

उपयोगकर्ता परिभाषित कार्य

उपयोगकर्ता परिभाषित फ़ंक्शन ऑथरिंग स्टूडियो में एक प्रयोगात्मक कार्यक्षमता है जो उपयोगकर्ताओं को अपना स्वयं का कस्टम फ़ंक्शन बनाने में सक्षम बनाता है। Power Apps

इस सुविधा का उपयोग करने के लिए, प्रायोगिक सेटिंग्स के अंतर्गत, नया विश्लेषण इंजन और उपयोगकर्ता-परिभाषित फ़ंक्शन (UDFs) चुनें

निम्न प्रकार से App.Formulas एक सूत्र परिभाषित करें:

FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula

कोड इस प्रकार काम करता है:

  • FunctionName फ़ंक्शन को आमंत्रित करने के लिए उपयोग किया जाता है

  • Parameter इनपुट का नाम है. एक या अधिक इनपुट की अनुमति है

  • DataType फ़ंक्शन में पारित किया गया तर्क इस डेटा प्रकार से मेल खाना चाहिए. उपलब्ध डेटा प्रकारों में बूलियन, रंग, दिनांक, दिनांक-समय, GUID, हाइपरलिंक, टेक्स्ट, समय, अलिखित ऑब्जेक्ट शामिल हैं

  • OutputDataType वह डेटा प्रकार है जिसमें फ़ंक्शन का आउटपुट होगा

  • Formula फ़ंक्शन का आउटपुट है

// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number = 
    IfError(Pi() * radius * radius, 0);

परिभाषित फ़ंक्शन के भीतर त्रुटि प्रबंधन को कार्यान्वित करने के लिए IfError का उपयोग करें।

टेक्स्ट/लेबल नियंत्रण से परिभाषित फ़ंक्शन को कॉल करें।

calcAreaOfCircle(Int(*TextInput1*.Text))

नोट

यह एक प्रायोगिक सुविधा है और इसमें परिवर्तन हो सकता है। कुछ डेटा प्रकार, जैसे रिकॉर्ड और फ़िल्टर, अभी तक समर्थित नहीं हैं.

चरों को अनुकूलित करें

वैरिएबल का उपयोग ऐप्स में हर जगह उपयोग किए जाने वाले स्थानीय और वैश्विक मानों को परिभाषित और सेट करने के लिए किया जाता है। हालांकि ये सुविधाजनक हैं, लेकिन बहुत अधिक होने पर ऐप कम अनुकूलित हो सकता है।

निम्नलिखित उदाहरण किसी ऑब्जेक्ट की प्रत्येक विशेषता के लिए एक चर सेट करना प्रदर्शित करता है, जिसके लिए प्रत्येक गुण के लिए Set का उपयोग करना आवश्यक है।

Set(varEmpName, Office365Users.MyProfile().DisplayName);
Set(varEmpCity, Office365Users.MyProfile().City);
Set(varEmpPhone, Office365Users.MyProfile().BusinessPhones);
Set(varEmpUPN, Office365Users.MyProfile().UserPrincipalName);
Set(varEmpMgrName, Office365Users.ManagerV2(varEmpUPN).DisplayName);

एक अधिक अनुकूलित दृष्टिकोण यह है कि संपत्ति का उपयोग तब करें जब आपको इसकी आवश्यकता हो:

Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName

संदर्भ चर और वैश्विक चर का बुद्धिमानी से उपयोग करें। यदि किसी चर का दायरा एकल स्क्रीन से आगे तक विस्तृत हो, तो संदर्भ चरों के स्थान पर वैश्विक चरों का उपयोग करने पर विचार करें।

बहुत अधिक अप्रयुक्त चरों के कारण मेमोरी का उपयोग बढ़ जाता है और ऐप आरंभीकरण की प्रक्रिया थोड़ी धीमी हो जाती है। ऐसा इसलिए है क्योंकि इन चरों के लिए संसाधन आवंटित किए जाते हैं, भले ही उनका सक्रिय रूप से उपयोग न किया जाता हो। बहुत अधिक अप्रयुक्त चर भी ऐप के तर्क की समग्र जटिलता को जन्म दे सकते हैं। यद्यपि अप्रयुक्त चरों का प्रभाव गंभीर नहीं हो सकता है, फिर भी इष्टतम प्रदर्शन और विकास में आसानी सुनिश्चित करने के लिए स्वच्छ और सुव्यवस्थित पावर ऐप को बनाए रखना एक अच्छा अभ्यास है।

संग्रह अनुकूलित करें

संग्रह अस्थायी डेटा भंडारण संरचनाएं हैं जिनका उपयोग किसी संग्रह के भीतर डेटा को संग्रहीत करने और उसमें हेरफेर करने के लिए किया जा सकता है। Power Apps अनुप्रयोग। हालाँकि, इसमें एक महीन रेखा होती है कि कब संग्रह से प्रदर्शन में अधिकता आ सकती है। इसलिए, अपने संग्रह का उपयोग सीमित रखें। इनका उपयोग केवल तभी करें जब वे आवश्यक हों।

// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});

// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});

स्थानीय संग्रह में रिकॉर्ड्स की गणना करने के लिए, के बजाय CountIf का उपयोग करें Count(Filter()).

संग्रहों के साथ काम करते समय इस मार्गदर्शन पर विचार करें:

संग्रह का आकार और संख्या सीमित करें. चूंकि संग्रह ऐप के लिए स्थानीय होते हैं, इसलिए उन्हें मोबाइल डिवाइस मेमोरी में संग्रहीत किया जाता है। संग्रह में जितना अधिक डेटा होगा या संग्रहों की संख्या जितनी अधिक होगी, प्रदर्शन उतना ही खराब होगा। केवल विशिष्ट कॉलम प्राप्त करने के लिए ShowColumns फ़ंक्शन का उपयोग करें। केवल प्रासंगिक डेटा प्राप्त करने के लिए Add Filter फ़ंक्शन का उपयोग करें।

निम्नलिखित उदाहरण फ़ंक्शन संपूर्ण डेटासेट लौटाता है।

ClearCollect(colDemoAccount, Accounts);

नीचे दिए गए कोड से तुलना करें जो केवल विशिष्ट रिकॉर्ड और कॉलम लौटाएगा:

ClearCollect(colAcc,
              ShowColumns(
                Filter(Accounts, !IsBlank('Address 1: City')),
                "name","address1_city"))

उदाहरण कोड यह डेटासेट लौटाता है:

colAcc नामक तालिका और डेटा, address1_city और नाम वाले दो कॉलम वाले डेटासेट का स्क्रीनशॉट

डेटा स्रोत ताज़ा आवृत्ति सेट करें. यदि आप संग्रह में नए रिकॉर्ड जोड़ रहे हैं, तो आपको संग्रह में नए या परिवर्तित रिकॉर्ड प्राप्त करने के लिए उसे रीफ़्रेश करना होगा या उसमें संग्रह करना होगा. यदि आपका डेटा स्रोत एकाधिक उपयोगकर्ताओं द्वारा अद्यतन किया जाता है, तो आपको नए या परिवर्तित रिकॉर्ड प्राप्त करने के लिए संग्रह को रीफ़्रेश करना होगा. अधिक रिफ्रेश कॉल का मतलब है सर्वर के साथ अधिक इंटरेक्शन।

संग्रहों और चरों में डेटा कैश करें

एक संग्रह, जो अनिवार्यतः एक तालिका चर है, इस मायने में विशिष्ट है कि यह एकल डेटा आइटम के बजाय डेटा की पंक्तियों और स्तंभों को संग्रहीत करता है। उनकी उपयोगिता दो मुख्य उद्देश्यों में निहित है: पहला, डेटा स्रोत को प्रेषित करने से पहले डेटा को एकत्रित करना, और दूसरा, सूचना को संचित करना, जिससे डेटा स्रोत को बार-बार क्वेरी करने की आवश्यकता समाप्त हो जाती है। चूंकि संग्रह डेटा स्रोत और Power Apps दोनों की सारणीबद्ध संरचना के साथ संरेखित होते हैं, इसलिए वे ऑफ़लाइन परिदृश्यों में भी डेटा के साथ बातचीत करने का एक कुशल साधन प्रदान करते हैं।

// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
    colEmployee,
    {
        Id: "1",
        Name: "John",
        Department: "IT"
    },
    {
        Id: "2",
        Name: "Nestor",
        Department: "IT"
    }
)

अप्रयुक्त चर और मीडिया को हटाएँ

यद्यपि अप्रयुक्त मीडिया और वेरिएबल्स ऐप के प्रदर्शन पर कोई बड़ा प्रभाव नहीं डालते हैं, फिर भी अपने ऐप को किसी भी अप्रयुक्त मीडिया या वेरिएबल्स से साफ़ करना महत्वपूर्ण है।

  • अप्रयुक्त मीडिया फ़ाइलें ऐप के आकार में समग्र वृद्धि में योगदान करती हैं। इससे ऐप लोड होने में देरी हो सकती है.

  • अप्रयुक्त चरों के कारण मेमोरी का उपयोग बढ़ जाता है और ऐप आरंभीकरण की प्रक्रिया थोड़ी धीमी हो जाती है। ऐसा इसलिए है क्योंकि इन चरों के लिए संसाधन आवंटित किए जाते हैं, भले ही उनका सक्रिय रूप से उपयोग न किया जाता हो। इसके अतिरिक्त, बहुत अधिक अप्रयुक्त चर, ऐप के तर्क की समग्र जटिलता को जन्म दे सकते हैं।

  • अप्रयुक्त मीडिया और चर की समीक्षा करने के लिए ऐप चेकर का उपयोग करें।

स्क्रीन और नियंत्रण अनुकूलित करें

क्रॉस रेफरेंसिंग नियंत्रण से बचें

अन्य स्क्रीन पर नियंत्रणों को संदर्भित करने वाले नियंत्रण ऐप लोडिंग और नेविगेशन को धीमा कर सकते हैं। ऐसा करने से ऐप को अन्य स्क्रीन को तुरंत लोड करने के लिए बाध्य होना पड़ सकता है, बजाय इसके कि वह उपयोगकर्ता के उस स्क्रीन पर पहुंचने तक प्रतीक्षा करे। इस समस्या को हल करने के लिए, स्क्रीन पर स्थिति साझा करने के लिए चर, संग्रह और नेविगेशन संदर्भ का उपयोग करें।

Power Apps संलेखन स्टूडियो के भीतर ऐप चेकर, क्रॉस संदर्भित नियंत्रणों को दिखाता है। इस समस्या के समाधान के लिए ऐप चेकर की नियमित समीक्षा करें।

यहां क्रॉस-रेफरेंस्ड नियंत्रणों का एक उदाहरण दिया गया है। नीचे दी गई छवि में गैलरी 1 नियंत्रण को स्क्रीन 2, लेबल 2 नियंत्रण में क्रॉस संदर्भित किया गया है।

क्रॉस-रेफ़रेंस नियंत्रण दिखाने वाला स्क्रीनशॉट Power Apps Studio

यदि आप ऐप में पहली स्क्रीन से किसी नियंत्रण को दूसरी स्क्रीन में संदर्भित करते हैं, तो प्रदर्शन पर कोई प्रभाव नहीं पड़ेगा, क्योंकि पहली स्क्रीन पहले ही लोड हो चुकी है और यह वास्तव में एक अच्छी बात हो सकती है, क्योंकि ऐप चरों का उपयोग करने के बजाय घोषणात्मक है।

यदि आप ऐसे नियंत्रणों को संदर्भित करते हैं जिन्हें अभी लोड किया जाना है, जैसे कि स्क्रीन 3 से Label 3 नामक नियंत्रण को संदर्भित करने वाली पहली स्क्रीन, तो स्क्रीन को मेमोरी में लोड करने की आवश्यकता होगी।

पाठ नियंत्रणों के लिए DelayOutput सक्षम करें

विलंबित आउटपुट सेटिंग जब सत्य पर सेट किया जाता है, तो उपयोगकर्ता इनपुट आधे सेकेण्ड विलंब के बाद पंजीकृत होता है। उपयोगकर्ता द्वारा पाठ इनपुट करने तक महंगे कार्यों को विलंबित करने के लिए उपयोगी, जैसे कि इनपुट को अन्य सूत्रों में उपयोग किए जाने पर फ़िल्टर करना।

उदाहरण के लिए, एक गैलरी के लिए जिसके आइटम TextInput नियंत्रण में इनपुट के आधार पर फ़िल्टर किए जाते हैं:

  • DelayOutput को false पर सेट करने पर, जो कि डिफ़ॉल्ट है, कोई भी टेक्स्ट टाइप होते ही गैलरी फ़िल्टर हो जाती है। यदि आपके पास बहुत सारी वस्तुओं वाली गैलरी है, तो परिवर्तनों के साथ गैलरी को तुरंत पुनः लोड करने से प्रदर्शन धीमा हो जाता है; थोड़ा इंतजार करना अधिक लाभप्रद होगा। यह तब व्यावहारिक होता है जब आप किसी खोज स्ट्रिंग के लिए TextInput का उपयोग कर रहे हों (देखें Search या नया StartsWith फ़ंक्शन)।

  • DelayOutput को true पर सेट करने पर, परिवर्तनों का पता लगने में एक सेकंड का विलंब लगता है। ऐसा इसलिए किया जाता है ताकि आपको अपनी इच्छानुसार टाइप करने का समय मिल सके। जब TextInput.OnChange प्रॉपर्टी की सहायता के लिए विलंब का उपयोग किया जाता है तो यह अच्छी तरह से काम करता है। यदि आपके पास परिवर्तनों से जुड़ी क्रियाएं हैं, तो आप उन्हें तब तक ट्रिगर नहीं करना चाहेंगे जब तक कि आप जो कुछ भी चाहते हैं वह फ़ील्ड में टाइप न हो जाए।

प्रत्यायोजन और सर्वर साइड प्रसंस्करण

प्रत्यायोजन

इन-डेलिगेशन एक अवधारणा है जो ऐप की उस क्षमता को संदर्भित करती है, जिसके तहत वह कुछ निश्चित कार्यों को अपने भीतर संसाधित करने के बजाय अंतर्निहित डेटा स्रोत पर स्थानांतरित कर देता है। Power Apps Power Apps Power Appsमें डेलिगेशन का उपयोग करके, डेवलपर्स अधिक कुशल और स्केलेबल एप्लिकेशन बना सकते हैं जो बड़े डेटासेट वाले परिदृश्यों में भी अच्छा प्रदर्शन करते हैं। विशिष्ट डेटा स्रोतों और परिचालनों के लिए प्रत्यायोजन सीमाओं के बारे में जागरूक होना और इष्टतम प्रदर्शन प्राप्त करने के लिए ऐप्स को तदनुसार डिज़ाइन करना महत्वपूर्ण है।

![नोट] सभी कार्य प्रत्यायोजित नहीं होते। कृपया देखें प्रतिनिधिमंडल को समझना प्रतिनिधिमंडल के बारे में अधिक जानने के लिए.

प्रत्यायोजन के कई लाभ हैं, जैसे क्वेरी अनुकूलन और बड़े डेटासेट के लिए समर्थन जोड़ना। इसके अतिरिक्त, यदि स्रोत डेटा बार-बार बदलता है, तो प्रत्यायोजन डेटा को अद्यतन रखने में मदद करता है।

डेटा स्रोत पर API कॉल कम करें

कभी-कभी, केवल कोडिंग प्रथाओं का पालन करना सुविधाजनक हो सकता है, जैसे कि कैनवास ऐप के भीतर जॉइन करके संग्रह बनाना। नीचे दिए गए कोड का संदर्भ लें:

इस उदाहरण में, दो तालिकाएँ हैं, ड्राइवर और ट्रक। डेवलपर ड्राइवरों और ट्रक के विवरण का संग्रह बनाने के लिए कोड लिखता है और प्रत्येक ट्रक के लिए, वे उन ड्राइवरों को बुलाते हैं जो ट्रक के मालिक हैं।

// Bad code
ClearCollect(vartruckdata, AddColumns('Truck Details',
    "CITY",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],City),
        "FIRSTNAME",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],'Driver First Name'),
    "LASTNAME",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],'Driver Last Name'),
        "STATE",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],State)));

कैनवास ऐप के भीतर से इस तरह के जॉइन ऑपरेशन करने से डेटा स्रोत पर कई कॉल उत्पन्न हो सकते हैं जिससे लोडिंग समय बहुत धीमा हो सकता है।

एक बेहतर तरीका यह है:

// Good code
Set(
    varTruckData,
    LookUp(
        Drivers,
        'Dummy ID' = ThisRecord.'Dummy ID',
        'Driver First Name'
    ) & LookUp(
        Drivers,
        'Dummy ID' = ThisRecord.'Dummy ID',
        'Driver Last Name'
        )
);

Set(
    varTruckData,
    With(
        {
            vDriver: LookUp(
                Drivers,
                'Dummy ID' = ThisRecord.'Dummy ID'
            )
        },
        vDriver.'Driver First Name' & vDriver.'Driver Last Name'
    )
)

वास्तविक समय परिदृश्य में, डेटा स्रोत स्तर पर डेटा को सही करके लोडिंग समय को 5 मिनट से घटाकर 10 सेकंड से कम करना संभव है।

सर्वर साइड प्रसंस्करण

विभिन्न डेटा स्रोत जैसे SQL और Dataverse आपको डेटा स्रोत को फ़िल्टर और लुकअप जैसे डेटा प्रोसेसिंग को सौंपने में सक्षम बनाता है। SQL सर्वर में, उपयोगकर्ता दृश्य बना सकते हैं, जिसमें क्वेरी द्वारा परिभाषित सामग्री होती है। इसी प्रकार, Dataverse, उपयोगकर्ता सर्वर साइड पर डेटा प्रोसेसिंग के लिए तर्क लिखने के लिए लो-कोड प्लगइन बना सकते हैं और केवल कैनवास ऐप्स में अंतिम परिणाम प्राप्त कर सकते हैं।

डेटा प्रोसेसिंग का कार्य सर्वर को सौंपने से समग्र प्रदर्शन में सुधार हो सकता है, क्लाइंट साइड पर कोड कम हो सकता है तथा इसका रखरखाव आसान हो जाता है।

बारे में और सीखो प्लगइन्स Dataverse.

क्वेरी डेटा पैटर्न को अनुकूलित करें

स्पष्ट कॉलम चयन का उपयोग करें

सभी नए ऐप्स के लिए स्पष्ट कॉलम चयन (ECS) सुविधा डिफ़ॉल्ट रूप से सक्षम होती है। यदि यह आपके ऐप के लिए सक्षम नहीं है, तो आपको इसे सक्षम करना चाहिए। ईसीएस स्वचालित रूप से प्राप्त कॉलमों की संख्या को घटाकर केवल उन कॉलमों तक सीमित कर देता है जो अनुप्रयोग में उपयोग किए जाते हैं। यदि ECS सक्षम नहीं है, तो हो सकता है कि आप आवश्यकता से अधिक डेटा प्राप्त कर रहे हों, जिससे प्रदर्शन प्रभावित हो सकता है। कभी-कभी, जब कोई ऐप संग्रह के माध्यम से डेटा खींचता है, तो कॉलम की मूल वंशावली या स्रोत खो सकता है। हमें नहीं पता कि इसका उपयोग हो रहा है या नहीं और हम इसे ईसीएस का उपयोग करके हटा देते हैं। आप आमतौर पर संग्रह संदर्भ के बाद PowerFx अभिव्यक्ति ShowColumns का उपयोग करके या नियंत्रण में इसका उपयोग करके ECS को किसी अनुपलब्ध कॉलम के लिए कार्य करने के लिए बाध्य कर सकते हैं।

संग्रह को पॉप्युलेट करने के लिए Power Automate को कॉल करने से बचें

संग्रहों को लाने और भरने के लिए Power Automate का उपयोग करना एक सामान्य अभ्यास है। Power Apps यद्यपि यह दृष्टिकोण मान्य है, फिर भी ऐसी स्थितियाँ हैं जहाँ यह सबसे कुशल विकल्प नहीं हो सकता है। कॉलिंग में नेटवर्क विलंबता का ओवरहेड शामिल होता है और प्रवाह को तत्काल शुरू करने में 0.6 सेकंड का प्रदर्शन लागत जुड़ता है। Power Automate Power Automate

प्रवाहों के अति प्रयोग से निष्पादन सीमाएं और थ्रॉटलिंग भी हो सकती है। Power Automate इसलिए हमेशा नेटवर्क विलंबता और प्रदर्शन लागत के बीच के अंतर का मूल्यांकन करें।

N+1 समस्या को समाप्त करें

एन+1 समस्या डेटाबेस क्वेरीज़ में एक आम समस्या है, जहां एक ही क्वेरी में सभी आवश्यक डेटा प्राप्त करने के बजाय, संबंधित डेटा को पुनः प्राप्त करने के लिए कई अतिरिक्त क्वेरीज़ बनाई जाती हैं। इससे प्रदर्शन संबंधी समस्याएं उत्पन्न हो सकती हैं, क्योंकि प्रत्येक अतिरिक्त क्वेरी के कारण अतिरिक्त व्यय होता है।

संग्रह को लोड करने के लिए इस तरह की एक सरल कॉल डेटा स्रोत के लिए N+1 कॉल उत्पन्न कर सकती है।

ClearCollect(MyCollection, OrdersList,
    {
        LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
    }
)

कैनवास ऐप्स और गैलरी के संदर्भ में, संबंधित रिकॉर्ड प्रदर्शित करने वाले डेटा स्रोतों और गैलरी के साथ काम करते समय N+1 समस्या उत्पन्न हो सकती है. यह समस्या आमतौर पर तब होती है जब गैलरी में प्रदर्शित प्रत्येक आइटम के लिए अधिक क्वेरीज़ बनाई जाती हैं, जिसके परिणामस्वरूप प्रदर्शन में बाधा उत्पन्न होती है।

N+1 क्वेरी समस्या से बचने के लिए SQL सर्वर में दृश्य ऑब्जेक्ट का उपयोग करें, या N+1 परिदृश्य को ट्रिगर करने से बचने के लिए उपयोगकर्ता इंटरफ़ेस बदलें।

Dataverse संबंधित तालिकाओं से आवश्यक डेटा स्वचालित रूप से प्राप्त करता है और आप संबंधित तालिकाओं से कॉलम का चयन कर सकते हैं।

ThisItem.Account.'Account Name'

यदि RelatedDataSource` का आकार छोटा है (<500 रिकॉर्ड), तो आप इसे संग्रह में कैश कर सकते हैं और लुकअप (N+1) क्वेरी परिदृश्य को चलाने के लिए संग्रह का उपयोग कर सकते हैं।

पैकेज का आकार सीमित करना

यद्यपि ऐप लोडिंग को अनुकूलित करने के लिए बहुत कुछ किया जाता है, फिर भी आप अपने ऐप्स के फ़ुटप्रिंट को कम करने के लिए कदम उठा सकते हैं। Power Apps कम फुटप्रिंट विशेष रूप से पुराने डिवाइसों के उपयोगकर्ताओं, या ऐसे स्थानों के उपयोगकर्ताओं के लिए महत्वपूर्ण है जहां विलंबता अधिक है या बैंडविड्थ कम है।

  • अपने ऐप में एम्बेड किए गए मीडिया का मूल्यांकन करें. यदि कोई चीज़ उपयोग में न हो तो उसे हटा दें।

  • एंबेडेड छवियाँ बहुत बड़ी हो सकती हैं. PNG फ़ाइलों के स्थान पर देखें कि क्या आप SVG छवियों का उपयोग कर सकते हैं। हालाँकि, SVG छवियों में पाठ का उपयोग करते समय सावधान रहें, क्योंकि उपयोग किया जाने वाला फ़ॉन्ट क्लाइंट पर इंस्टॉल होना चाहिए। जब आपको पाठ दिखाने की आवश्यकता हो तो एक बेहतरीन समाधान यह है कि आप किसी चित्र के ऊपर पाठ लेबल लगा दें।

  • मूल्यांकन करें कि क्या रिज़ॉल्यूशन फॉर्म फैक्टर के लिए उपयुक्त है। मोबाइल ऐप के लिए रिज़ॉल्यूशन डेस्कटॉप ऐप के रिज़ॉल्यूशन जितना उच्च होना आवश्यक नहीं है। छवि गुणवत्ता और आकार का सही संतुलन पाने के लिए प्रयोग करें।

  • यदि आपके पास अप्रयुक्त स्क्रीन हैं, तो उन्हें हटा दें। ध्यान रखें कि ऐसी कोई भी छिपी हुई स्क्रीन न हटाएं जिसका उपयोग केवल ऐप निर्माता या प्रशासक ही करते हैं।

  • मूल्यांकन करें कि क्या आप एक ऐप में बहुत सारे वर्कफ़्लोज़ फ़िट करने का प्रयास कर रहे हैं। उदाहरण के लिए, क्या आपके पास एक ही ऐप में एडमिन स्क्रीन और क्लाइंट स्क्रीन दोनों हैं? यदि ऐसा है, तो उन्हें अलग-अलग ऐप्स में विभाजित करने पर विचार करें। इस दृष्टिकोण से एक ही समय में कई लोगों के लिए ऐप्स पर काम करना आसान हो जाएगा, और जब ऐप में परिवर्तन के लिए पूर्ण परीक्षण पास की आवश्यकता होती है, तो यह "ब्लास्ट रेडियस" (परीक्षण की मात्रा) को सीमित कर देता है।

सभी के लिए अनुकूलित करें

ForAll में Power Apps फ़ंक्शन का उपयोग रिकॉर्ड की तालिका के माध्यम से पुनरावृत्ति करने और प्रत्येक रिकॉर्ड पर एक सूत्र या सूत्रों के सेट को लागू करने के लिए किया जाता है। हालांकि यह फ़ंक्शन अपने आप में बहुमुखी है, लेकिन ForAll फ़ंक्शन का अनुचित उपयोग आपके ऐप को कम प्रदर्शन करने वाला बना सकता है।

ForAll फ़ंक्शन समवर्ती फ़ंक्शन के बजाय एकवचन अनुक्रमिक फ़ंक्शन है। इसलिए यह एक समय में केवल एक ही रिकार्ड को देखता है, परिणाम प्राप्त करता है, फिर अगले रिकार्ड पर तब तक चलता रहता है जब तक कि यह अपने दायरे में सभी रिकार्डों को नहीं देख लेता।

किसी भी कीमत पर नेस्टिंग फॉरऑल से बचें। इससे घातीय पुनरावृत्ति हो सकती है और प्रदर्शन पर महत्वपूर्ण प्रभाव पड़ सकता है।

ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))

डेटाबेस के लिए बैच अद्यतन

ForAll + Patch डेटाबेस को बैच अपडेट करने का एक तरीका हो सकता है। हालाँकि, फॉर ऑल और पैच के क्रम का उपयोग करने में सावधानी बरतें।

निम्नलिखित कार्य:

Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
    {
        demoName:"fromCanvas2"
    })
);

इससे बेहतर प्रदर्शन है:

ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
    {
        demoName:"test"
    })
);

अगला कदम