Aracılığıyla paylaş


Kod iyileştirme

Tuval uygulamaları farklı iş gereksinimlerini karşılayacak şekilde geliştikçe, performansı en iyi şekilde tutmak kritik önem taşır. Veri işleme, kullanıcı arabirimi tasarımı ve uygulama işlevselliğinin tümü, kod optimizasyonu için dikkatli bir yaklaşım gerektirir.

Tuval uygulamaları daha karmaşık hale geldiğinde, veri alma, formül karmaşıklığı ve oluşturma hızı ile ilgili sorunlarla karşılaşabilirsiniz. Güçlü işlevselliği ve duyarlı bir kullanıcı arabirimini dengelemek, kod optimizasyonu için sistematik bir yaklaşıma ihtiyacınız olduğu anlamına gelir.

Power Fx formüllerini iyileştirme

With işlevi

With işlevi, tek bir kayıt için bir formülü değerlendirir. Formül bir değeri hesaplayabilir veya verileri değiştirmek veya bir bağlantıyla çalışmak gibi eylemler gerçekleştirebilir. Karmaşık formülleri daha küçük adlandırılmış alt formüllere bölerek okunmasını kolaylaştırmak için With'i kullanın. Bu adlandırılmış değerler, kapsamı With ile sınırlı basit yerel değişkenler gibi davranır. Bağlam veya genel değişkenlerden With kullanmak daha iyidir çünkü kendi kendine yeterlidir, anlaşılması kolaydır ve herhangi bir bildirimsel formül bağlamında çalışır. işlevi hakkında With.

With fonksiyonunu kullanan Power Fx formülünün ekran görüntüsü.

Concurrent işlevi

Concurrent fonksiyonu, aynı özellikteki birden fazla formülün, bağlayıcı veya Dataverse çağrısı varsa aynı anda değerlendirilmesini sağlar. Normalde, birden fazla formülü ; (noktalı virgül) operatörüyle zincirlediğinizde aynı anda değerlendirilir. Concurrent ile uygulama, ; operatörü kullanıldıktan sonra bile, bir özellikteki tüm formülleri aynı anda değerlendirir. Bu eşzamanlılık, kullanıcıların sonuçlar için daha az beklemesi anlamına gelir. Önceki çağrılar bitmeden yeni veri çağrıları başlamadığında, uygulamanın tüm istek sürelerinin toplamı kadar bekler. Veri çağrıları aynı anda başlarsa, uygulamanın yalnızca en uzun istek süresi kadar bekler. işlevi hakkında Concurrent.

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

Coalesce İşlevi

Coalesce fonksiyonu argümanlarını sırayla değerlendirir ve boş olmayan ilk değeri veya boş bir dizeyi döndürür. Bu işlevi boş bir değeri veya boş dizeyi farklı bir değerle değiştirmek için kullanın ancak boş olmayan değer veya boş olmayan dize değerlerinde değişiklik yapmayın. Eğer tüm argümanlar boşsa veya boş dizelerse, fonksiyon boş değer döndürür. Coalesce boş dizeleri boş değerlere dönüştürmenin iyi bir yoludur.

Örneğin:

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

Değer 1 ve değer 2'nin iki kez değerlendirilmesini gerektirir. Bu işlev aşağıdakilere indirgenebilir:

Coalesce(value1, value2)

IsMatch işlevi

IsMatch fonksiyonu, bir metin dizesinin sıradan karakterlerden oluşan bir desenle, önceden tanımlanmış desenlerle veya düzenli bir ifadeyle eşleşip eşleşmediğini test eder. işlevi hakkında IsMatch.

Örneğin, bu formül Amerika Birleşik Devletleri Sosyal Güvenlik numarasıyla eşleşir:

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

Normal ifadenin açıklaması:

\\d Herhangi bir basamakla (0-9) eşleşir.

{3} Önceki basamak desenin (\d) tam olarak üç kez gerçekleşmesi gerektiğini belirtir.

- Tire karakteriyle eşleşir.

{2} Önceki basamak desenin (\d) tam olarak iki kez gerçekleşmesi gerektiğini belirtir.

{4} Önceki basamak desenin (\d) tam olarak dört kez gerçekleşmesi gerektiğini belirtir.

Daha fazla IsMatch örneği:

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

App OnStart işlevini iyileştirme

Tuval uygulamalarına ait OnStart özelliği, uygulama başlatıldığında gerçekleşen eylemlerin tanımlanmasında çok önemli bir rol oynar. Bu özellik, uygulama geliştiricilerin genel başlatma görevlerini yürütmesine, değişkenler ayarlamasına ve yalnızca uygulamanın başlatma işlemi sırasında bir kez oluşması gereken eylemleri gerçekleştirmesine olanak tanır. OnStart özelliğini anlamak ve etkili bir şekilde kullanmak, duyarlı ve verimli tuval uygulamaları oluşturmak için çok önemlidir.

Bunun için önerilen bir yaklaşım değişken kurulumlarını adlandırılmış formüllere taşıyarak App.OnStart işlevini hızlandırmaktır. Adlandırılmış formüllerin, özellikle uygulama yaşam döngüsünün başlarında yapılandırılanların avantajları kanıtlanmıştır. Bu formüller veri çağrılarına göre değişkenlerin başlatılmasını işleyerek kodunuz için daha temiz ve daha düzenli bir yapı sağlar. Daha ayrıntılı bilgi için Büyük ve karmaşık tuval uygulamaları oluşturma - Power Apps | Microsoft Learn bölümüne bakın.

Not

OnStart özelliği zorunludur. İlk ekran gösterilmeden önce yapılması gereken işlerin sıralı bir listesidir. Yalnızca yapılması gereken şey değil, bu işin sıraya göre ne zaman yapılması gerektiği konusunda da çok kesin olduğundan, başka türlü de gerçekleştirilebilecek yeniden sıralama ve erteleme iyileştirmelerini sınırlar.

Başlangıç ekranı

App.OnStart bir Navigate işlevi çağrısı içeriyorsa, bir If işlevi olsa ve nadiren çağrılsa da, App. özelliğini yürütme işini OnStart uygulamanın ilk ekranını göstermeden önce tamamlamamız gerekir.  App.StartScreen hangi ekranın ilk olarak gösterileceğini belirtmenin iyileştirmeleri engellemeyen, yeni açıklayıcı yoludur.

StartScreen özelliği ayarlandığında, ilk ekran App.OnStart tamamlanmadan önce gösterilir. App.StartScreen declares herhangi bir ön işlem gerektirmeden, ilk olarak gösterilecek ekran nesnesini belirler.

Aşağıdaki gibi bir kod yazmak yerine:

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

Kodu aşağıdaki gibi değiştirin:

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

Daha ayrıntılı bilgi için <https://Power Apps.microsoft.com/en-us/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart/> adresine bakın.

Uyarı

StartScreen ve OnStart arasındaki bağımlılıklardan kaçının. Adlandırılmış bir formüle başvurulması ve bunun da küresel bir değişkene başvurulması, StartScreen'in doğru uygulanmadığı bir yarış durumuna neden olabilir. Not: StartScreen ve OnStart arasında bağımlılıklarımız olmamalıdır. StartScreen'de global değişkenlere başvurmayı engelleriz, ancak global bir değişkene başvuran bir adlandırılmış formüle başvurabiliriz ve bu, StartScreen'in doğru uygulanmadığı bir yarış durumuna neden olabilir.

Adlandırılmış formüller

Adlandırılmış formüller App.Formulas bölümünde tanımlanabilen statik veya sabit değerlerdir. App.Formulas içinde bildirildikten sonra, uygulama içinde herhangi bir yerde kullanılabilirler ve değerleri her zaman güncel kalır. Power Apps içindeki Adlandırılmış Formüller, platform tarafından otomatik olarak yönetilen ve güncelleştirilen değer tanımlarını veya değer kümelerini etkinleştirir. Bu işlevsellik, değer hesaplaması ve izleme sorumluluğunu geliştiriciden Power Apps'e aktarır ve geliştirme sürecini hızlandırır. Power Apps'teki Adlandırılmış Formüller, uygulama performansını artırıp bakımını kolaylaştırabilen güçlü bir işlevdir.

Adlandırılmış formüller uygulama temalarını bildirme işleminde de kullanılabilir. Kurumsal uygulamaların oluşturulduğu pek çok durumda, uygulamanın tutarlı bir görünüm ve kullanıcı deneyimi sunmak için ortak temalara sahip olmasını istenir. Tema oluşturmak için App OnStart üzerinde bildirilmesi gereken onlarca ve yüzlerce değişken vardır. Uygulamanın bu kod uzunluğu ve başlatma süresi artmış.

Modern denetimler, tema oluşturmada önemli ölçüde yardımcı olabilir ve tema oluşturmak üzere müşteri tarafından yazılan mantığın azaltılmasını sağlar. Modern denetimler şu anda önizleme aşamasındadır.

Örneğin, App.OnStart üzerinde bulunan aşağıdaki kod App.Formulas üzerine taşınarak genel değişken bildirimlerinin başlatma süresi azaltılabilir.

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");

Kod App.Formulas'a şu şekilde taşınabilir:

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";

Bir başka örnek de Lookups ayarında yer alır. Burada kullanıcı verilerini Dataverse yerine, Office 365'ten almak için Lookup formülünde bir değişiklik yapılması gerekir. Bu değişiklik kodun tamamında değil, yalnızca bir yerde yapılmalıdır.

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');

Bu formüller hesaplamanın özünü barındırır. Değerlerine dayalı olarak UserEmail, UserInfo, UserTitle ve UserPhone belirleme sürecini ifade ederler. Mantığın kapsüllenmesi uygulama genelinde yaygın kullanım sağlar ve mantık tek bir konumda değiştirilebilir. Uyarlanabilirlik, uygulama genelin yayılmış formüllerde değişiklik yapılmasına gerek kalmadan Dataverse Kullanıcılar tablosundan Office 365 bağlayıcısına geçişe kadar genişletilebilir.

Bir diğer yaklaşım da countRows özelliğini iyileştirmektir.

varListItems = CountRows(SampleList)

Set İşlevi ile, varListItems değişkeninin örnek listesindeki ilk satır sayısıyla başlatılıp liste öğeleri eklendikten veya çıkarıldıktan sonra yeniden ayarlanmalıdır. Adlandırılmış formüllerde, veri değişikliklerinde olduğu gibi, varListitems değişkenleri de otomatik olarak güncelleştirilir.

App.Formulas özelliğindeki Adlandırılmış Formüller uygulamada değerlerin yönetilmesine ve hesaplamalara yönelik daha esnek ve açıklayıcı bir yaklaşım sağlarken, zamanlama bağımsızlığı, otomatik güncelleştirmeler, sürdürülebilirlik ve sabit tanımlar açısından yalnızca App.OnStart kullanmaktan daha avantajlıdır.

Bölüm Adlandırılmış Formüller (App.Formulas) App.OnStart
Zamanlama Bağımsızlığı Formüller hemen kullanılmaya hazırdır ve herhangi bir sırayla hesaplanabilir. Değişkenler zamanlama bağımlılıkları getirebilir, bu da kullanılabilirliği etkiler.
Otomatik Güncelleştirmeler Bağımlılıklar değiştiğinde formüller otomatik olarak güncelleştirilir. Değişkenler başlatma sırasında bir kez ayarlanır; el ile güncelleştirmeler gerekebilir.
Devamlılık Tek bir konumdaki merkezi formüller kullanılabilirliği artırır. Uygulamaya dağıtılmış değişkenlerin farklı yerlerde aranması ve güncelleştirilmesi gerekebilir.
Sabit Tanımlar App.Formulas içindeki formül tanımları sabittir. Değişken değerleri yanlışlıkla yapılan değişikliklere duyarlıdır.

Kullanıcı tarafından tanımlanan işlevler

Power Apps Authoring Studio'daki Kullanıcı Tanımlı Fonksiyonlar kullanıcıların kendi özel fonksiyonlarını oluşturmalarına olanak tanır.

Bu özelliği kullanmak için, önizleme ayarları altında, Kullanıcı tanımlı işlev (UDF'ler) seçeneğini etkinleştirin. Önizleme işlevi üretimde kullanılmamalıdır, bu nedenle varsayılan olarak devre dışıdır, ancak yakında genel kullanıma sunulacaktır.

App.Formulas altında aşağıdaki şekilde bir formül tanımlayın:

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

Kod şu şekilde çalışır:

  • FunctionName, işlevi çağırmak için kullanılır

  • Parameter girişin adıdır. Bir veya birden fazla girişe izin verilir

  • DataType, işleve geçirilen bir bağımsız değişkendir ve bu veri türüyle eşleşmelidir. Kullanılabilir veri türleri arasında Boole, Renk, Date, Datetime, Dynamic, GUID, Hyperlink, Text ve Time bulunur

  • OutputDataType, işlev çıktısının veri türüdür

  • Formula işlevin çıktısıdır

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

Tanımlı işlev içinde hata işleme uygulamak için IfError kullanın.

Tanımlı işlevi metin/etiket denetiminden çağırın.

calcAreaOfCircle(Int(*TextInput1*.Text))

Not

Bu, deneysel bir özelliktir ve değiştirilebilir. Kayıt ve filtreler gibi bazı veri türleri henüz desteklenmemektedir.

Değişkenleri iyileştirme

Değişkenler, uygulamanız genelinde kullandığınız yerel ve genel değerleri tanımlar ve ayarlar. Kullanışlı olsalar da, çok fazla değişken kullanmak uygulamanızı daha az verimli hale getirebilir.

Aşağıdaki örnek, bir nesnenin her niteliği için bir değişkenin nasıl ayarlanacağını göstermektedir; bu da her özellik için Set kullanılmasını gerektirir.

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);

Daha verimli bir yaklaşım, özelliği yalnızca ihtiyacınız olduğunda kullanmaktır:

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

Bağlam değişkenlerini ve genel değişkenleri dikkatle kullanın. Bir değişkenin kapsamı tek bir ekranın ötesine geçiyorsa bağlam değişkenleri yerine genel değişkenleri kullanın.

Çok fazla kullanılmayan değişken bellek kullanımını artırır ve uygulamanın başlatılmasını yavaşlatabilir. Kaynaklar, siz kullanmasanız bile bu değişkenler için ayrılır. Kullanılmayan değişkenler de uygulamanızın mantığına karmaşıklık katar. Etkisi şiddetli olmasa da, daha iyi performans ve daha kolay geliştirme için Power App'inizi temiz ve düzenli tutmak iyi bir uygulamadır.

Koleksiyonları iyileştirme

Koleksiyonlar, verileri bir Power Apps uygulamasında depolamak ve düzenlemek için kullandığınız geçici veri depolama yapılarıdır. Koleksiyonlar, çok fazla kullanırsanız performans yüküne neden olabilir. Koleksiyon kullanımınızı sınırlayın ve yalnızca gerektiğinde kullanın.

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

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

Yerel bir koleksiyondaki kayıtları saymak için CountIf yerine Count(Filter()) kullanın.

Koleksiyonlarla çalışırken şu yönergeleri dikkate alın:

Koleksiyonların boyutunu ve sayısını sınırlandırın. Koleksiyonlar uygulamada yerel olduğundan, mobil cihaz belleğinde depolanır. Ne kadar çok veri koleksiyonu tutulursa veya ne kadar çok koleksiyon kullanırsanız performans o kadar kötü olur. Sadece belirli sütunları almak için ShowColumns fonksiyonunu kullanın. Sadece ilgili verileri almak için Filter fonksiyonunu ekleyin.

Aşağıdaki örnekte işlev tüm veri kümesi döndürür.

ClearCollect(colDemoAccount, Accounts);

Bunu, yalnızca belirli kayıtları ve sütunları döndüren aşağıdaki kodla karşılaştırın:

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

Bu örnek, aşağıdaki veri kümesini döndürür:

colAcc adlı bir tablo ve address1_city ve name adlı iki sütundan oluşan bir veri kümesinin ekran görüntüsü.

Bir veri kaynağı yenileme sıklığı ayarlayın. Koleksiyona yeni kayıtlar eklerseniz, yeni veya değiştirilmiş kayıtları almak için koleksiyonu yenileyin veya toplayın. Veri kaynağınızı birden çok kullanıcı güncelleştirirse, yeni veya değiştirilmiş kayıtları almak için koleksiyonu yenileyin. Daha fazla yenileme çağrısı, sunucuyla daha fazla etkileşim anlamına gelir.

Koleksiyonlardaki ve değişkenlerdeki önbellek verileri

Koleksiyon, yalnızca tek bir veri öğesini değil, veri satırlarını ve sütunlarını depolayan bir tablo değişkenidir. Koleksiyonlar iki ana nedenden dolayı yararlıdır: verileri veri kaynağına göndermeden önce toplama ve sık sorgulardan kaçınmak için bilgileri önbelleğe alma. Koleksiyonlar veri kaynağının ve Power Apps'in tablosal yapısıyla eşleştiği için çevrimdışı olduğunuzda bile verilerle etkili bir şekilde etkileşim kurmanızı sağlar.

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

Kullanılmayan değişkenleri ve ortamları kaldırma

Kullanılmayan medya ve değişkenlerin uygulama performansı üzerinde önemli bir etkisi olmasa da, kullanılmayan medyaları veya değişkenleri kaldırarak uygulamanızı temizlemeniz önemlidir.

  • Kullanılmayan medya dosyaları uygulama boyutunu artırır ve bu da uygulama yükleme sürelerini yavaşlatabilir.

  • Kullanılmayan değişkenler bellek kullanımını artırır ve uygulamanın başlatılmasını biraz yavaşlatabilir. Kaynaklar, kullanılmasalar bile bu değişkenler için ayrılır. Çok fazla kullanılmayan değişken de uygulamanın mantığını daha karmaşık hale getirebilir.

  • Kullanılmayan ortamları ve değişkenleri gözden geçirmek için Uygulama Denetleyicisi'ni kullanın.

Ekranları ve denetimleri iyileştirme

Çapraz başvuru denetimlerinden kaçınma

Başka ekranlardaki başvuru denetimlerine başvuran denetimler uygulamanın yüklemesini ve uygulamada gezinmeyi yavaşlatabilir. Bunu yapmak, kullanıcı o ekrana gidene kadar beklemek yerine uygulamayı diğer ekranları hemen yüklemeye zorlayabilir. Bu sorunu düzeltmek için, durumu ekranlar arasında paylaşmak üzere değişkenleri, koleksiyonları ve gezinme bağlamını kullanın.

Power Apps Studio'deki Uygulama denetleyicisi çapraz referanslı kontrolleri gösterir. Bu sorunu çözmek için Uygulama denetleyicisini düzenli olarak gözden geçirin.

İşte çapraz referanslı kontrollerin bir örneği. Aşağıdaki görüntüde, Galeri 1 denetimine Ekran 2, Etiket 2 denetiminde çapraz başvuru yapılmıştır.

Çapraz referanslı bir kontrolü gösteren Power Apps Studio ekran görüntüsü.

İkinci ekranda uygulamadaki ilk ekrandan bir denetime başvurursanız, ilk ekran zaten yüklenmiş olduğundan bir performans kaybı olmaz. Bu aslında iyi bir şey olabilir çünkü uygulama değişkenleri kullanmak yerine deklaratif bir yapıdadır.

Henüz yüklenmemiş denetimlere başvurursanız, örneğin ilk ekranın 3. ekrandan Label 3 adlı bir denetime başvurması durumunda, uygulama o ekranı belleğe yükler.

Metin denetimleri için DelayOutput özelliğini etkinleştirme

DelayOutput ayarı true olarak ayarlandığında, kullanıcı girdisini yarım saniyelik bir gecikmeden sonra kaydeder. Bu, girdinin başka formüllerde kullanıldığında filtreleme gibi, pahalı işlemlerin kullanıcı metni girmeyi bitirene kadar geciktirilmesi için yararlıdır.

Örneğin, kullanıcının TextInput denetimine ne girdiğine bağlı olarak Öğeleri Filtrelenen bir Galeri için:

  • DelayOutput varsayılan değer olan false değerine ayarlandığında, herhangi bir metin yazılır yazılmaz galeri filtrelenir. Çok sayıda öğe içeren bir galeriniz varsa, galeriyi değişikliklerle hemen yeniden yüklemek performansı yavaşlatır. Biraz beklemek daha iyi. Bu yöntem, bir arama dizesi için TextInput kullandığınızda kullanışlıdır (bkz. Arama veya yeni StartsWith işlevleri).

  • DelayOutput true olarak ayarlandığında, değişiklikler algılanmadan önce kısa bir gecikme olur. Bu, yazmayı bitirmeniz için size zaman verir. Gecikme, TextInput.OnChange özelliğiyle iyi çalışır. Değişikliklere bağlı eylemleriniz varsa, alana yazmayı bitirene kadar bunların tetiklenmesini istemezsiniz.

Temsilci atama ve sunucu tarafı işlemesi

Temsilci

Power Apps'te temsilci atama, uygulamanın belirli işlemleri Power Apps içinde işlemesi yerine, belirli işlemleri alt veri kaynağına yükleme yeteneğini ifade eden bir kavramdır. Power Apps'te temsilci atama özelliğini kullanarak, geliştiriciler büyük veri kümeleri içeren senaryolarda bile iyi performans gösteren daha verimli ve ölçeklenebilir uygulamalar oluşturabilir. Belirli veri kaynakları ve işlemlerine ilişkin temsilci sınırlamalarına dikkat etmek ve en iyi performansı elde etmek için uygulamaları buna göre tasarlamak önemlidir.

![NOT] Temsilci atama özelliği her işlevle kullanılamaz. Temsilci atama hakkında daha fazla bilgi için Temsilci Atama Özelliğini Anlama bölümüne bakın.

Temsilci atamanın Sorgu iyileştirme gibi pek çok avantajı vardır ve bu özellik büyük veri kümeleri için ek destek sağlar. Ayrıca, kaynak verileri sıklıkla değişiyorsa, temsilci atama verilerin güncel kalmasına yardımcı olur.

Veri kaynağına yapılan API çağrılarını azaltma

Bazen, tuval uygulamanız içinde birleştirmeler gerçekleştirerek koleksiyonlar oluşturmak uygun görünebilir. Bir örnek aşağıda verilmiştir:

Bu örnekte, iki tablo bulunmaktadır: Sürücüler ve Kamyonlar. Kod, sürücülerin ve kamyon ayrıntılarının bir koleksiyonunu oluşturur ve her kamyon için kamyonun sahibi olan sürücüyü arar.

// 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)));

Tuval uygulaması içinde bu tür bir birleştirme gerçekleştirmek, veri kaynağına çok sayıda çağrı oluşturabilir ve bu da yükleme sürelerinin yavaşlamasına neden olur.

Daha iyi bir yaklaşım şöyledir:

// 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'
    )
)

Gerçek zamanlı senaryoda, verileri kaynağında düzelterek yükleme sürelerini beş dakikadan 10 saniyenin altına düşürebilirsiniz.

Sunucu tarafı işlemesi

SQL ve Dataverse gibi farklı veri kaynakları, filtreler ve aramalar gibi veri işlemelerini veri kaynağına devretmenize olanak tanır. SQL Server'da, bir sorgu tarafından tanımlanan görünümler oluşturabilirsiniz. Dataverse'de, sunucudaki verileri işleyip yalnızca nihai sonuçları tuval uygulamanıza döndürecek düşük kodlu eklentiler oluşturabilirsiniz.

Veri işlemeyi sunucuya devretmek performansı artırabilir, istemci tarafı kodunu azaltabilir ve uygulamanızın bakımını kolaylaştırabilir.

Dataverse'te eklentiler hakkında daha fazla bilgi edinin.

Sorgu veri kalıplarını iyileştirme

Açık sütun seçimini kullanma

Açık Sütun Seçimi (ECS) özelliği tüm yeni uygulamalar için varsayılan olarak açıktır. Uygulamanız için etkin değilse açın. ECS, alınan sütun sayısını otomatik olarak yalnızca uygulamada kullanılanlara azaltır. ECS açık değilse, ihtiyacınız olandan daha fazla veri alabilirsiniz ve bu da performansı etkileyebilir. Bazen, bir uygulama koleksiyonlar aracılığıyla veri aldığında, bir sütunun orijinal kaynağı kaybolabilir. ECS, kullanıldıklarını söyleyemezse sütunları bırakır. ECS'nin eksik bir sütunu tutmasını zorlamak için, bir koleksiyon referansından sonra veya bir kontrolde PowerFx ifadesini ShowColumns kullanın.

Bir koleksiyonu doldurmak için Power Automate çağrısı yapmaktan kaçınma

Power Apps'te koleksiyonları almak ve doldurmak için Power Automate kullanmak yaygın bir uygulamadır. Bu geçerli bir yaklaşım olsa da en etkili seçenek olmadığı durumlar olabilir. Power Automate çağrısı genel bir ağ gecikmesine neden olur ve Power Automate akışı oluştururken 0,6 saniyeli bir performans maliyeti ekler.

Power Automate akışlarının aşırı kullanılması yürütme sınırlarına ve azaltmaya da yol açabilir. Bu nedenle, ağ gecikmesi ve performans maliyeti arasındaki dengeyi her zaman değerlendirin.

N+1 problemini ortadan kaldırma

N+1 problemi gerekli tüm verileri tek bir sorguyla almak yerine, ilgili verileri almak için birden çok ek sorgu yapılan veritabanı sorgularında yaygın bir sorundur. Her ek sorgu genel yükün içinde gerçekleştiğinden, bu problem performans sorunlarına neden olabilir.

Bir koleksiyon yüklemek için gerçekleştirilen bu türden basit bir çağrı veri kaynağına N+1 sayıda çağrı oluşturabilir.

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

Tuval uygulamaları ve galeriler bağlamında, N+1 problemi ilgili kayıtları görüntüleyen veri kaynaklarıyla çalışırken ortaya çıkabilir. Bu sorun genellikle galeride görüntülenen her öğe için daha fazla sorgu yapılması nedeniyle performans zorlandığında ortaya çıkar.

N+1 sorgu problemini önlemek için SQL Server'da Nesneleri görüntüle seçeneğini kullanın veya N+1 senaryosunu tetiklemekten kaçınmak üzere kullanıcı arabirimini değiştirin.

Dataverse, ilgili tabloların gerekli verilerini otomatik olarak alır ve ilgili tablolardan sütunlar seçebilirsiniz.

ThisItem.Account.'Account Name'

RelatedDataSource` boyutu küçükse (<500 kayıt), bunu bir koleksiyonda önbelleğe alabilir ve koleksiyonu Arama (N+1) sorgu senaryosu için kullanabilirsiniz.

Paket boyutunu sınırlama

Power Apps uygulamanın yüklenmesini iyileştirmek için pek çok işlem gerçekleştirse de uygulamalarınızın ayak izini azaltmak için bazı adımlar atabilirsiniz. Düşük ayak izi özellikle eski cihaz kullanıcıları veya gecikme süresinin yüksek ya da bant genişliğinin düşük olduğu yerel ağlarda çalışan kullanıcılar için önemlidir.

  • Uygulamanıza katıştırılmış ortamları değerlendirin. Kullanılmayan öğeleri silin.

  • Katıştırılmış görüntüler çok büyük olabilir. PNG dosyaları yerine, SVG görüntüleri kullanıp kullanmayabileceğinize bakın. Ancak kullanılan yazı tipinin istemcide yüklü olması gerektiğinden, SVG görüntülerinde metin kullanırken dikkatli olun. Metin kullanmanız gerektiğinde başvurabileceğiniz en iyi geçici çözüm bir görüntünün üzerine metin etiketi eklemektir.

  • Çözünürlüğün form faktörü için uygun olup olmadığını değerlendirin. Bir mobil uygulamanın çözünürlüğünün masaüstü uygulama kadar yüksek olması gerekmez. Görüntü kalitesi ve boyutunda doğru dengeyi elde etmek için denemeler yapın.

  • Kullanılmayan ekranlarınız varsa, bunları silin. Yalnızca uygulama oluşturucuların veya yöneticilerin kullandığı gizli ekranları silmemeye dikkat edin.

  • Tek bir uygulamaya çok fazla iş akışı sığdırmaya çalışıp çalışmadığınıza bakın. Örneğin, aynı uygulamada hem yönetici ekranlarınız hem de istemci ekranlarınız var mı? Varsa, bunları ayrı ayrı uygulamalara bölün. Bu yaklaşım aynı zamanda birden fazla kişinin uygulamalarda aynı anda çalışmasını kolaylaştırır ve uygulama değişiklikleri eksiksiz test başarısı gerektirdiğinde "patlama çapını" (test miktarı) sınırlar.

ForAll işlevini iyileştirme

Power Apps'teki ForAll işlevi bir kayıt tablosunda yineleme yapmak ve her kayda formül veya formül kümesi uygulamak için kullanılır. İşlevin kendisi çok yönlü olsa da, ForAll işlevinin hatalı kullanımı uygulamanızın performansını hızla düşürebilir.

ForAll işlevi eşzamanlı değil, sıralı bir işlevdir. Bu nedenle, tek seferde yalnızca bir kayda bakar, sonucu alır ve kapsamındaki tüm kayıtları tamamlayana kadar sonraki kayda geçer.

ForAll işlevinde İç İçe Geçme seçeneğini kullanmaktan her durumda kaçının. Bu, çok sayıda yinelemeye neden olur ve performansı önemli ölçüde etkiler.

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

Veritabanında toplu güncelleştirmeler

ForAll + Patch, Veritabanını toplu olarak güncelleştirmek için kullanılabilir. Ancak ForAll ve Patch emrini kullanırken dikkatli olun.

Aşağıdaki işlev:

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

Şunlardan daha iyi performans gösterir:

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

Sonraki adım