नोट
इस पेज तक पहुँच के लिए प्रमाणन की आवश्यकता होती है. आप साइन इन करने या निर्देशिकाओं को बदलने का प्रयास कर सकते हैं.
इस पेज तक पहुँच के लिए प्रमाणन की आवश्यकता होती है. आप निर्देशिकाओं को बदलने का प्रयास कर सकते हैं.
चूंकि कैनवास ऐप्स विभिन्न व्यावसायिक आवश्यकताओं को पूरा करने के लिए विकसित होते हैं, इसलिए प्रदर्शन को इष्टतम बनाए रखना महत्वपूर्ण है। डेटा प्रबंधन, उपयोगकर्ता इंटरफ़ेस डिज़ाइन और ऐप कार्यक्षमता सभी के लिए कोड अनुकूलन हेतु सावधानीपूर्वक दृष्टिकोण की आवश्यकता होती है।
जैसे-जैसे कैनवास ऐप्स अधिक जटिल होते जाते हैं, आप डेटा पुनर्प्राप्ति, सूत्र जटिलता और रेंडरिंग गति के साथ समस्याओं का सामना कर सकते हैं। एक उत्तरदायी उपयोगकर्ता इंटरफ़ेस के साथ मजबूत कार्यक्षमता को संतुलित करने के लिए, कोड अनुकूलन के लिए एक व्यवस्थित दृष्टिकोण का उपयोग करें।
Power Fx सूत्र अनुकूलन
यह अनुभाग Power Fx सूत्रों को अनुकूलित करने के लिए सर्वोत्तम अभ्यास प्रदान करता है.
फ़ंक्शन के साथ
With फ़ंक्शन एकल रिकॉर्ड के लिए सूत्र का मूल्यांकन करता है. सूत्र किसी मान की गणना कर सकता है या कार्य कर सकता है, जैसे डेटा संशोधित करना या कनेक्शन के साथ काम करना। जटिल सूत्रों को छोटे नामित उपसूत्रों में विभाजित करके उन्हें पढ़ने में आसान बनाने के लिए With का उपयोग करें। ये नामित मान सरल स्थानीय चर की तरह कार्य करते हैं जो के दायरे तक सीमित होते हैं। With
With संदर्भ या वैश्विक चर से बेहतर है क्योंकि यह स्व-निहित है, समझने में आसान है, और किसी भी घोषणात्मक सूत्र संदर्भ में काम करता है।
साथ फ़ंक्शन के बारे में अधिक जानें.
समवर्ती कार्य
Concurrent फ़ंक्शन एक ही संपत्ति में कई सूत्रों को एक ही समय में मूल्यांकन करने की अनुमति देता है यदि उनके पास कनेक्टर या डेटावर्स कॉल हैं। सामान्यतः, जब आप उन्हें ; (अर्धविराम) ऑपरेटर के साथ श्रृंखलाबद्ध करते हैं, तो एक ही समय में कई सूत्रों का मूल्यांकन किया जाता है।
Concurrentके साथ, ऐप ; ऑपरेटर का उपयोग करने के बाद भी, एक ही समय में प्रॉपर्टी में सभी फ़ार्मुलों का मूल्यांकन करता है। इस समवर्ती का मतलब है कि उपयोगकर्ता परिणामों के लिए कम समय प्रतीक्षा करते हैं। जब पिछली कॉल समाप्त होने तक डेटा कॉल शुरू नहीं होती, तो ऐप सभी अनुरोध समयों के योग की प्रतीक्षा करता है। यदि डेटा कॉल एक ही समय पर शुरू होती हैं, तो ऐप केवल सबसे लंबे अनुरोध समय तक ही प्रतीक्षा करता है।
समवर्ती फ़ंक्शन के बारे में अधिक जानें.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
कोलेस्से फ़ंक्शन
Coalesce फ़ंक्शन अपने तर्कों का क्रम में मूल्यांकन करता है और पहला मान लौटाता है जो रिक्त या खाली स्ट्रिंग नहीं है। किसी रिक्त मान या रिक्त स्ट्रिंग को किसी भिन्न मान से बदलने के लिए इस फ़ंक्शन का उपयोग करें, लेकिन गैर-रिक्त और गैर-रिक्त स्ट्रिंग मानों को अपरिवर्तित छोड़ दें। यदि सभी तर्क रिक्त या खाली स्ट्रिंग हैं, तो फ़ंक्शन रिक्त लौटाता है।
Coalesce खाली स्ट्रिंग को रिक्त मानों में बदलने का एक अच्छा तरीका है।
Coalesce फ़ंक्शन के बारे में अधिक जानें।
इस उदाहरण की आवश्यकता है value1 और इसका value2 दो बार मूल्यांकन किया जाना चाहिए:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
इस फ़ंक्शन को निम्न प्रकार से कम किया जा सकता है:
Coalesce(value1, value2)
IsMatch फ़ंक्शन
IsMatch फ़ंक्शन यह जाँचता है कि क्या कोई टेक्स्ट स्ट्रिंग साधारण वर्णों, पूर्वनिर्धारित पैटर्न या नियमित अभिव्यक्ति से बने पैटर्न से मेल खाती है।
IsMatch फ़ंक्शन के बारे में अधिक जानें।
उदाहरण के लिए, यह सूत्र United States Social Security नंबर से मेल खाता है:
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 सुव्यवस्थित करें। नामित सूत्र, विशेष रूप से वे जो ऐप जीवनचक्र की शुरुआत में कॉन्फ़िगर किए गए हैं, फायदेमंद हैं। ये सूत्र डेटा कॉल के आधार पर चरों के आरंभीकरण को संभालते हैं, तथा आपके कोड के लिए अधिक स्वच्छ और व्यवस्थित संरचना प्रदान करते हैं।
बड़े और जटिल कैनवास ऐप्स बनाएं में और जानें.
नोट
OnStart संपत्ति अनिवार्य है। यह काम की एक क्रमबद्ध सूची है जिसे पहली स्क्रीन दिखाई देने से पहले करने की आवश्यकता होती है। क्योंकि यह न केवल इस बारे में इतना विशिष्ट है कि क्या करने की आवश्यकता है, बल्कि यह भी कि जब उस काम को आदेश के आधार पर किया जाना चाहिए, तो यह अनुकूलन को फिर से व्यवस्थित करने और स्थगित करने को सीमित करता है जो अन्यथा किया जा सकता है।
स्क्रीन चालू करें
यदि App.OnStart इसमें कोई Navigate फ़ंक्शन कॉल है, भले ही वह किसी फ़ंक्शन If में हो और शायद ही कभी कॉल किया जाता है, तो ऐप को ऐप की पहली स्क्रीन दिखाने से पहले इसका निष्पादन App.OnStart पूरा करना होगा।
App.StartScreen यह इंगित करने का एक घोषणात्मक तरीका है कि कौन सी स्क्रीन पहले दिखाई जानी चाहिए, और यह अनुकूलन को अवरुद्ध नहीं करता है।
StartScreen प्रॉपर्टी सेट करने पर App.OnStart पूरा होने से पहले पहली स्क्रीन दिखाई देती है।
App.StartScreen किसी भी प्रीप्रोसेसिंग की आवश्यकता के बिना पहले कौन सी स्क्रीन ऑब्जेक्ट दिखानी है, यह घोषित करता है।
इस तरह का कोड लिखने के बजाय:
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)
अधिक जानकारी: App.StartScreen: App.OnStart में नेविगेट करने का एक घोषणात्मक विकल्प।
चेतावनी
StartScreen और के बीच निर्भरता से बचें OnStart. एक नामित सूत्र को संदर्भित करना जो बदले में एक वैश्विक चर को संदर्भित करता है, एक दौड़ की स्थिति का कारण बन सकता है जिसमें StartScreen सही ढंग से लागू नहीं किया गया है।
और के StartScreenबीच OnStart निर्भरता न बनाएं। जबकि ऐप वैश्विक चर को संदर्भित करने को अवरुद्ध करता है StartScreen, आप एक नामित सूत्र का संदर्भ ले सकते हैं, जो बदले में एक वैश्विक चर का संदर्भ देता है। इस दृष्टिकोण के कारण दौड़ की स्थिति हो सकती है जिसमें सही StartScreen तरीके से लागू नहीं किया जाता है।
नामित सूत्र
नामित सूत्र स्थिर या स्थिरांक होते हैं जिन्हें परिभाषित किया जा App.Formulasसकता है। एक बार घोषित करने के App.Formulasबाद, उन्हें ऐप में कहीं भी इस्तेमाल किया जा सकता है, और उनके मूल्य हमेशा अद्यतित रहते हैं। Power Apps में नामित सूत्र आपको उन मानों या मानों के सेट को परिभाषित करने देते हैं जिन्हें प्लेटफ़ॉर्म स्वचालित रूप से प्रबंधित और अपडेट करता है. यह कार्यक्षमता मूल्य गणना और रखरखाव की जिम्मेदारी डेवलपर से Power Apps पर स्थानांतरित कर देती है, जिससे विकास प्रक्रिया सुव्यवस्थित हो जाती है. Power Apps में नामित सूत्र एक शक्तिशाली विशेषता है जो ऐप के प्रदर्शन और रखरखाव को महत्वपूर्ण रूप से बढ़ा सकती है।
नामित सूत्र ऐप थीम घोषित करते समय भी मदद करते हैं। जब आप एंटरप्राइज़ ऐप्स बनाते हैं, तो आप अक्सर चाहते हैं कि ऐप में सामान्य थीम हों जो एक सुसंगत रूप और उपयोगकर्ता अनुभव प्रदान करें। एक थीम बनाने के लिए, आपको दसियों से सैकड़ों चर App.OnStartघोषित करने की आवश्यकता है। यह घोषणा कोड की लंबाई और ऐप के आरंभीकरण समय को बढ़ाती है।
आधुनिक नियंत्रण भी थीमिंग में महत्वपूर्ण रूप से मदद कर सकते हैं तथा थीमिंग को संभालने के लिए ग्राहक द्वारा लिखे गए तर्क को कम करने में मदद कर सकते हैं। आधुनिक नियंत्रण अभी पूर्वावलोकन में हैं।
उदाहरण के लिए, आप निम्न कोड को यहां ले App.OnStartApp.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में है। यहां, Dataverse के बजाय Office 365 से उपयोगकर्ता जानकारी प्राप्त करने के लिए Lookup सूत्र में परिवर्तन की आवश्यकता है। आपको हर जगह कोड बदले बिना, केवल एक ही स्थान पर परिवर्तन करने की आवश्यकता है।
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 हैं। |
परिवर्तनीय मान आकस्मिक परिवर्तनों के लिए अतिसंवेदनशील हो सकते हैं। |
उपयोगकर्ता परिभाषित कार्य
निम्न प्रकार से एक सूत्र परिभाषित करें: App.Formulas
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
कोड इस प्रकार काम करता है:
FunctionNameफ़ंक्शन को आमंत्रित करता है।Parameterइनपुट का नाम है. आप एक या अधिक इनपुट शामिल कर सकते हैं।DataTypeवह डेटा प्रकार है जिसे फ़ंक्शन में पारित तर्क से मेल खाना चाहिए। उपलब्ध डेटा प्रकारों में बूलियन, रंग, दिनांक, दिनांक समय, गतिशील, GUID, हाइपरलिंक, पाठ और समय शामिल हैं.OutputDataTypeफ़ंक्शन के आउटपुट के लिए डेटा प्रकार है।Formulaफ़ंक्शन का आउटपुट है।
परिभाषित फ़ंक्शन के भीतर त्रुटि प्रबंधन को लागू करने के लिए उपयोग करें IfError :
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
किसी पाठ या लेबल नियंत्रण से निर्धारित फ़ंक्शन को कॉल करें।
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 App को साफ़ और व्यवस्थित रखें.
संग्रह अनुकूलित करें
संग्रह अस्थायी डेटा storage संरचनाएँ होती हैं, जिनका उपयोग आप 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फ़ंक्शन का उपयोग करें। केवल प्रासंगिक डेटा प्राप्त करने के लिएFilterफ़ंक्शन जोड़ें।निम्न उदाहरण फ़ंक्शन संपूर्ण डेटासेट लौटाता है:
ClearCollect(colDemoAccount, Accounts);इस फ़ंक्शन की तुलना निम्न कोड से करें, जो केवल विशिष्ट रिकॉर्ड और स्तंभ लौटाता है:
ClearCollect(colAcc, ShowColumns( Filter(Accounts, !IsBlank('Address 1: City')), "name","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 में स्क्रीन और नियंत्रणों को अनुकूलित करने के लिए, निम्नलिखित सर्वोत्तम प्रथाओं पर विचार करें।
क्रॉस रेफरेंसिंग नियंत्रण से बचें
अन्य स्क्रीन पर नियंत्रणों को संदर्भित करने वाले नियंत्रण ऐप लोडिंग और नेविगेशन को धीमा कर सकते हैं। यह दृष्टिकोण ऐप को उपयोगकर्ता के उस स्क्रीन पर जाने तक प्रतीक्षा करने के बजाय अन्य स्क्रीन लोड करने के लिए मजबूर कर सकता है। इस समस्या को हल करने के लिए, स्क्रीन पर स्थिति साझा करने के लिए चर, संग्रह और नेविगेशन संदर्भ का उपयोग करें।
Power Apps Studio में ऐप चेकर उन नियंत्रणों को दिखाता है जो क्रॉस-रेफरेंस किए जाते हैं. इस समस्या को ठीक करने के लिए नियमित रूप से ऐप चेकर की समीक्षा करें.
निम्न छवि में, गैलरी 1 नियंत्रण स्क्रीन 2, लेबल 2 नियंत्रण में क्रॉस-संदर्भित है।
यदि आप दूसरी स्क्रीन में ऐप में पहली स्क्रीन से नियंत्रण का संदर्भ देते हैं, तो कोई प्रदर्शन हिट नहीं होता है क्योंकि पहली स्क्रीन पहले से ही लोड होती है। यह व्यवहार वास्तव में फायदेमंद है क्योंकि ऐप चर का उपयोग करने के बजाय घोषणात्मक है।
यदि आप उन नियंत्रणों का संदर्भ देते हैं जो अभी तक लोड नहीं हुए हैं, जैसे कि स्क्रीन 3 से नाम वाले Label 3 नियंत्रण को संदर्भित करने वाली पहली स्क्रीन, तो ऐप उस स्क्रीन को मेमोरी में लोड करता है।
पाठ नियंत्रणों के लिए DelayOutput सक्षम करें
DelayOutput सेटिंग, जब सही पर सेट होती है, तो आधे सेकंड की देरी के बाद उपयोगकर्ता इनपुट को पंजीकृत करती है। यह देरी महंगे संचालन को स्थगित करने के लिए उपयोगी है जब तक कि उपयोगकर्ता पाठ दर्ज करना समाप्त नहीं कर लेता, जैसे कि अन्य सूत्रों में इनपुट का उपयोग किए जाने पर फ़िल्टरिंग।
उदाहरण के लिए, एक गैलरी पर विचार करें जिसके आइटम इस बात पर निर्भर करते हैं कि उपयोगकर्ता TextInput नियंत्रण में क्या दर्ज करता है:
यदि आप DelayOutput को false पर सेट करते हैं, जो डिफ़ॉल्ट है, तो गैलरी किसी भी पाठ को टाइप करते ही फ़िल्टर हो जाती है। यदि आपके पास कई वस्तुओं के साथ एक गैलरी है, तो तुरंत परिवर्तनों के साथ गैलरी को फिर से लोड करने से प्रदर्शन धीमा हो जाता है। इंतजार करना बेहतर है। यह व्यवहार व्यावहारिक है जब आप किसी खोज स्ट्रिंग या
TextInputफ़ंक्शन के लिए उपयोग करStartsWithरहे हैं।यदि आप DelayOutput को सही पर सेट करते हैं, तो परिवर्तनों का पता चलने से पहले थोड़ी देरी होती है। यह देरी टाइपिंग समाप्त करने के लिए समय प्रदान करती है। देरी संपत्ति के साथ
TextInput.OnChangeअच्छी तरह से काम करती है। यदि आपके पास परिवर्तनों से जुड़ी क्रियाएँ हैं, तो आप उन्हें तब तक ट्रिगर नहीं करना चाहते जब तक कि आप फ़ील्ड में टाइप करना समाप्त नहीं कर लेते.
प्रतिनिधिमंडल और सर्वर-साइड प्रसंस्करण
डेलिगेशन और सर्वर-साइड प्रोसेसिंग का उपयोग करने से आपके ऐप को डेटा स्रोत पर संचालन को ऑफलोड करके बड़े डेटासेट को कुशलतापूर्वक संभालने की अनुमति मिलती है।
प्रत्यायोजन
Power Apps में डेलिगेशन Power Apps के भीतर संचालन को संसाधित करने के बजाय अंतर्निहित डेटा स्रोत पर कुछ कार्यों को ऑफलोड करने की ऐप की क्षमता को संदर्भित करता है. Power Apps में डेलिगेशन का उपयोग करके, आप अधिक कुशल और स्केलेबल एप्लिकेशन बना सकते हैं जो बड़े डेटासेट वाले परिदृश्यों में भी अच्छा प्रदर्शन करते हैं. विशिष्ट डेटा स्रोतों और संचालन के लिए प्रतिनिधिमंडल सीमाओं से अवगत रहें, और इष्टतम प्रदर्शन प्राप्त करने के लिए अपने ऐप को तदनुसार डिज़ाइन करें।
नोट
सभी कार्य delegable नहीं हैं। क्वेरी सीमाएँ: प्रत्यायोजन और क्वेरी सीमाएँ में डेलिगेशन के बारे में अधिक जानें.
प्रतिनिधिमंडल के कई फायदे हैं, जैसे क्वेरी अनुकूलन और बड़े डेटासेट के लिए समर्थन। इसके अतिरिक्त, यदि स्रोत डेटा बार-बार बदलता है, तो प्रत्यायोजन डेटा को अद्यतन रखने में मदद करता है।
डेटा स्रोत पर 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'
)
)
वास्तविक समय परिदृश्य में, आप स्रोत पर डेटा को ठीक करके लोडिंग समय को पांच मिनट से घटाकर 10 सेकंड से कम कर सकते हैं।
सर्वर-साइड प्रोसेसिंग
विभिन्न डेटा स्रोत, जैसे SQL और Dataverse, आपको डेटा प्रोसेसिंग, जैसे फ़िल्टर और लुकअप, को डेटा स्रोत को सौंपने देता है। SQL Server में, आप किसी क्वेरी द्वारा परिभाषित दृश्य बना सकते हैं. में Dataverse, आप सर्वर पर डेटा को संसाधित करने और अपने कैनवास ऐप पर केवल अंतिम परिणाम वापस करने के लिए लो-कोड प्लगइन बना सकते हैं।
डेटा प्रोसेसिंग का काम सर्वर को सौंपने से प्रदर्शन में सुधार हो सकता है, क्लाइंट-साइड कोड कम हो सकता है, और आपके ऐप का रखरखाव आसान हो सकता है।
बारे में और सीखो प्लगइन्स Dataverse.
क्वेरी डेटा पैटर्न को अनुकूलित करें
आपके ऐप क्वेरी डेटा को अनुकूलित करने से लोड समय को काफी कम किया जा सकता है और समग्र प्रतिक्रिया में सुधार किया जा सकता है।
स्पष्ट कॉलम चयन का उपयोग करें
सभी नए ऐप्स के लिए स्पष्ट कॉलम चयन (ECS) सुविधा डिफ़ॉल्ट रूप से चालू होती है। अगर यह आपके ऐप्लिकेशन के लिए चालू नहीं है, तो उसे चालू करें. ईसीएस स्वचालित रूप से प्राप्त कॉलमों की संख्या को घटाकर केवल उन कॉलमों तक सीमित कर देता है जिनका उपयोग ऐप में किया जाता है। यदि ECS चालू नहीं है, तो आपको आवश्यकता से अधिक डेटा प्राप्त हो सकता है, जिससे प्रदर्शन प्रभावित हो सकता है। कभी-कभी, जब कोई ऐप संग्रह के माध्यम से डेटा प्राप्त करता है, तो कॉलम का मूल स्रोत खो सकता है। ईसीएस कॉलम को छोड़ देता है यदि यह निर्धारित नहीं कर सकता है कि उनका उपयोग किया गया है। ECS को अनुपलब्ध स्तंभ रखने के लिए बाध्य करने के लिए, संग्रह संदर्भ के बाद या किसी नियंत्रण में Power Fx अभिव्यक्ति ShowColumns का उपयोग करें.
किसी संग्रह को पॉप्युलेट करने के लिए Power Automate को कॉल करने से बचें
Power Apps में संग्रह लाने और पॉप्युलेट करने के लिए Power Automate का उपयोग करना एक सामान्य अभ्यास है. यद्यपि यह दृष्टिकोण मान्य है, फिर भी ऐसी स्थितियाँ हैं जहाँ यह सबसे कुशल विकल्प नहीं हो सकता है। Power Automate को कॉल करने से नेटवर्क विलंबता और 0.6-सेकंड की प्रदर्शन लागत जुड़ जाती है ताकि Power Power Automate प्रवाह को त्वरित किया जा सके.
Power Automate प्रवाह के अति प्रयोग से निष्पादन सीमाएँ और थ्रॉटलिंग भी हो सकती है। हमेशा नेटवर्क विलंबता और प्रदर्शन लागत के बीच व्यापार-नापसंद का मूल्यांकन करें।
N+1 समस्या को समाप्त करें
एन+1 समस्या डेटाबेस क्वेरीज़ में एक आम समस्या है, जहां एक ही क्वेरी में सभी आवश्यक डेटा प्राप्त करने के बजाय, संबंधित डेटा को पुनः प्राप्त करने के लिए कई अतिरिक्त क्वेरीज़ बनाई जाती हैं। यह समस्या प्रदर्शन समस्याओं के लिए नेतृत्व कर सकते हैं, क्योंकि प्रत्येक अतिरिक्त क्वेरी ओवरहेड है।
संग्रह लोड करने के लिए इस तरह की एक साधारण कॉल डेटा स्रोत पर N+1 कॉल उत्पन्न कर सकती है:
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
कैनवास ऐप्स और गैलरी के संदर्भ में, संबंधित रिकॉर्ड प्रदर्शित करने वाले डेटा स्रोतों और गैलरी के साथ काम करते समय N+1 समस्या उत्पन्न हो सकती है। यह समस्या आमतौर पर तब होती है जब गैलरी में प्रदर्शित प्रत्येक आइटम के लिए अधिक क्वेरीज़ बनाई जाती हैं, जिसके परिणामस्वरूप प्रदर्शन में बाधा उत्पन्न होती है।
N+1 क्वेरी समस्या से बचने के लिए SQL Server में ऑब्जेक्ट देखें का उपयोग करें, या N+1 परिदृश्य ट्रिगर करने से बचने के लिए उपयोगकर्ता इंटरफ़ेस परिवर्तित करें।
Dataverse संबंधित तालिकाओं से आवश्यक डेटा स्वचालित रूप से प्राप्त करता है और आप संबंधित तालिकाओं से कॉलम का चयन कर सकते हैं।
ThisItem.Account.'Account Name'
यदि RelatedDataSource आकार छोटा है (500 से कम रिकॉर्ड्स), तो इसे किसी संग्रह में कैश करें और लुकअप (N+1) क्वेरी परिदृश्य को चलाने के लिए संग्रह का उपयोग करें.
पैकेज का आकार सीमित करें
हालाँकि Power Apps ऐप लोडिंग को अनुकूलित करता है, आप अपने ऐप्स के पदचिह्न को कम करने के लिए कदम उठा सकते हैं. कम फ़ुटप्रिंट पुराने उपकरणों के उपयोगकर्ताओं या उन स्थानों के उपयोगकर्ताओं के लिए विशेष रूप से महत्वपूर्ण है जहां उच्च विलंबता या कम बैंडविड्थ है।
अपने ऐप में एम्बेड किए गए मीडिया का मूल्यांकन करें। यदि कोई चीज़ उपयोग में न हो तो उसे हटा दें।
उदाहरण के लिए, एम्बेड की गई छवियां बहुत बड़ी हो सकती हैं। PNG फ़ाइलों के स्थान पर देखें कि क्या आप SVG छवियों का उपयोग कर सकते हैं। SVG छवियों में पाठ का उपयोग करने के बारे में सावधान रहें क्योंकि फ़ॉन्ट क्लाइंट पर स्थापित किया जाना चाहिए। जब आपको पाठ दिखाने की आवश्यकता होती है, तो एक समाधान किसी छवि पर एक पाठ लेबल को सुपरइम्पोज़ करना होता है।
मूल्यांकन करें कि क्या रिज़ॉल्यूशन फॉर्म फैक्टर के लिए उपयुक्त है। मोबाइल ऐप के लिए रिज़ॉल्यूशन डेस्कटॉप ऐप के रिज़ॉल्यूशन जितना उच्च होना आवश्यक नहीं है। छवि गुणवत्ता और आकार का सही संतुलन पाने के लिए प्रयोग करें।
यदि आपके पास अप्रयुक्त स्क्रीन हैं, तो उन्हें हटा दें। ध्यान रखें कि ऐसी कोई भी छिपी हुई स्क्रीन न हटाएं जिसका उपयोग केवल ऐप निर्माता या प्रशासक ही करते हैं।
मूल्यांकन करें कि क्या आप एक ऐप में बहुत सारे वर्कफ़्लोज़ फ़िट करने का प्रयास कर रहे हैं। उदाहरण के लिए, क्या आपके पास एक ही ऐप में एडमिन स्क्रीन और क्लाइंट स्क्रीन दोनों हैं? यदि ऐसा है, तो उन्हें अलग-अलग ऐप्स में विभाजित करने पर विचार करें। यह दृष्टिकोण एक ही समय में कई लोगों के लिए ऐप्स पर काम करना आसान बनाता है, और यह "ब्लास्ट रेडियस" (परीक्षण की मात्रा) को सीमित करता है जब ऐप परिवर्तनों के लिए पूर्ण परीक्षण पास की आवश्यकता होती है।
सभी के लिए अनुकूलित करें
Power Apps में ForAll फ़ंक्शन का उपयोग रिकॉर्ड्स की तालिका के माध्यम से पुनरावृति करने और प्रत्येक रिकॉर्ड पर सूत्र या सूत्रों के सेट को लागू करने के लिए किया जाता है. जबकि फ़ंक्शन स्वयं बहुमुखी है, फ़ंक्शन का ForAll अनुचित उपयोग आपके ऐप को जल्दी से कम प्रदर्शन करने वाला बना सकता है।
ForAll फ़ंक्शन एक समवर्ती फ़ंक्शन के बजाय एक विलक्षण अनुक्रमिक फ़ंक्शन है। इसलिए, यह एक समय में केवल एक रिकॉर्ड को देखता है, परिणाम प्राप्त करता है, और फिर अगले रिकॉर्ड तक जारी रहता है जब तक कि यह अपने दायरे में सभी रिकॉर्ड से नहीं गुजरता।
घोंसले के शिकार से ForAllबचें। यह अभ्यास घातीय पुनरावृत्तियों को जन्म दे सकता है और प्रदर्शन को महत्वपूर्ण रूप से प्रभावित कर सकता है।
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
बैच डेटाबेस अद्यतन करें
आप डेटाबेस का उपयोग कर ForAll सकते हैं और बैच Patch अद्यतन करने के लिए। हालाँकि, जब आप और के ForAllक्रम Patch का उपयोग करते हैं तो सावधान रहें।
निम्नलिखित फ़ंक्शन बेहतर दृष्टिकोण है, उदाहरण के लिए:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
जबकि निम्नलिखित दृष्टिकोण कम कुशल है:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);