Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dosya sistemine verimli bir şekilde erişen Windows Uygulama SDK'sı ile WinUI uygulamaları oluşturarak disk gecikme süresi ve gereksiz bellek veya CPU kullanımından kaynaklanan performans sorunlarını önleyin.
Büyük bir dosya koleksiyonuna erişmek ve tipik Name, FileType ve Path özellikleri dışındaki özellik değerlerine erişmek istediğinizde, QueryOptions oluşturup SetPropertyPrefetch'i çağırarak bunlara erişin. SetPropertyPrefetch yöntemi, görüntü koleksiyonu gibi dosya sisteminden alınan bir öğe koleksiyonunu görüntüleyen uygulamaların performansını önemli ölçüde artırabilir. Sonraki örnek kümesinde birden çok dosyaya erişmenin birkaç yolu gösterilmektedir.
İlk örnekte, bir dosya kümesinin ad bilgilerini almak için Windows.Storage.StorageFolder.GetFilesAsync kullanılır. Örnek yalnızca name özelliğine eriştiğinden bu yaklaşım iyi bir performans sağlar.
StorageFolder library = Windows.Storage.KnownFolders.PicturesLibrary;
IReadOnlyList<StorageFile> files = await library.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByDate);
for (int i = 0; i < files.Count; i++)
{
// Do something with the name of each file.
string fileName = files[i].Name;
}
İkinci örnekte Windows.Storage.StorageFolder.GetFilesAsync kullanılır ve her dosyanın görüntü özellikleri alınır. Bu yaklaşım düşük performans sağlar.
StorageFolder library = Windows.Storage.KnownFolders.PicturesLibrary;
IReadOnlyList<StorageFile> files = await library.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByDate);
for (int i = 0; i < files.Count; i++)
{
ImageProperties imgProps = await files[i].Properties.GetImagePropertiesAsync();
// Do something with the date the image was taken.
DateTimeOffset date = imgProps.DateTaken;
}
Üçüncü örnek, bir dosya kümesi hakkında bilgi almak için QueryOptions'ı kullanır. Bu yaklaşım önceki örnekten çok daha iyi performans sağlar.
// Set QueryOptions to prefetch our specific properties.
var queryOptions = new Windows.Storage.Search.QueryOptions(CommonFileQuery.OrderByDate, null);
queryOptions.SetThumbnailPrefetch(
ThumbnailMode.PicturesView,
100,
ThumbnailOptions.ReturnOnlyIfCached);
queryOptions.SetPropertyPrefetch(
PropertyPrefetchOptions.ImageProperties,
new string[] { "System.Size" });
StorageFileQueryResult queryResults = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> files = await queryResults.GetFilesAsync();
foreach (var file in files)
{
ImageProperties imageProperties = await file.Properties.GetImagePropertiesAsync();
// Do something with the date the image was taken.
DateTimeOffset dateTaken = imageProperties.DateTaken;
// Performance gains increase with the number of properties that are accessed.
IDictionary<string, object> propertyResults =
await file.Properties.RetrievePropertiesAsync(new string[] { "System.Size" });
// Get or set extra properties here.
var systemSize = propertyResults["System.Size"];
}
gibi Windows.Storage.ApplicationData.Current.LocalFolderWindows.Storage nesnelerinde birden çok işlem gerçekleştiriyorsanız, her erişişinde ara nesneleri yeniden oluşturmamak için bu depolama kaynağına başvurmak için yerel bir değişken oluşturun.
C#'de akım performansı
Windows Runtime ile .NET akışları arasında tamponlama
Bir Windows Çalışma Zamanı akışını ( Windows.Storage.Streams.IInputStream veya IOutputStream gibi) .NET akışına (System.IO.Stream) dönüştürmek isteyebileceğiniz birçok senaryo vardır. Örneğin, bir WinUI uygulaması yazarken ve Windows Depolama API'leriyle akışlarda çalışan mevcut .NET kodunu kullanmak istediğinizde bu yararlı olur. Bunu etkinleştirmek için .NET, .NET ve Windows Çalışma Zamanı akış türleri arasında dönüştürme yapmanızı sağlayan uzantı yöntemleri sağlar. Daha fazla bilgi için bkz. WindowsRuntimeStreamExtensions.
Bir Windows Çalışma Zamanı akışını .NET akışına dönüştürdüğünüzde, temel alınan Windows Çalışma Zamanı akışı için etkili bir şekilde bir bağdaştırıcı oluşturursunuz. Bazı durumlarda, Windows Çalışma Zamanı akışlarında çağırma yöntemleriyle ilişkili bir çalışma zamanı maliyeti vardır. Bu, özellikle de çok sayıda küçük, sık okuma veya yazma işlemi gerçekleştirdiğiniz senaryolarda uygulamanızın hızını etkileyebilir.
Windows Çalışma Zamanı akış bağdaştırıcıları, uygulamaları hızlandırmaya yardımcı olmak için bir veri arabelleği içerir. Aşağıdaki kod örneği, varsayılan arabellek boyutuna sahip bir Windows Runtime stream adaptörü kullanılarak yapılan küçük ardışık okumaları gösterir.
StorageFile file = await Windows.Storage.ApplicationData.Current
.LocalFolder.GetFileAsync("example.txt");
Windows.Storage.Streams.IInputStream windowsRuntimeStream =
await file.OpenReadAsync();
byte[] destinationArray = new byte[8];
// Create an adapter with the default buffer size.
using (var managedStream = windowsRuntimeStream.AsStreamForRead())
{
// Read 8 bytes into destinationArray.
// A larger block is actually read from the underlying
// windowsRuntimeStream and buffered within the adapter.
await managedStream.ReadAsync(destinationArray, 0, 8);
// Read 8 more bytes into destinationArray.
// This call may complete much faster than the first call
// because the data is buffered and no call to the
// underlying windowsRuntimeStream needs to be made.
await managedStream.ReadAsync(destinationArray, 0, 8);
}
Windows Çalışma Zamanı akışını .NET akışına dönüştürdüğünüz çoğu senaryoda bu varsayılan arabelleğe alma davranışı tercih edilir. Ancak bazı senaryolarda performansı artırmak için tamponlama davranışını değiştirmek isteyebilirsiniz.
Büyük veri kümeleriyle çalışma
Daha büyük veri kümelerini okurken veya yazarken, AsStreamForRead, AsStreamForWrite ve AsStream uzantısı yöntemlerine büyük bir arabellek boyutu sağlayarak okuma veya yazma aktarım hızınızı artırabilirsiniz. Bu, akış bağdaştırıcısına daha büyük bir iç arabellek boyutu verir. Örneğin, büyük bir dosyadan gelen bir akışı XML ayrıştırıcısına geçirirken, ayrıştırıcı akıştan birçok sıralı küçük okuma yapabilir. Büyük bir arabellek, temel alınan Windows Çalışma Zamanı akışına yapılan çağrı sayısını azaltabilir ve performansı artırabilir.
Uyarı
Yaklaşık 80 KB'tan büyük bir arabellek boyutu ayarlarken dikkatli olun çünkü bu, çöp toplayıcı yığınında parçalanmalara neden olabilir. İlgili yönergeler için bkz. WinUI uygulamalarında çöp toplama performansını geliştirme. Aşağıdaki kod örneği, 81.920 baytlık arabelleğe sahip bir yönetilen akış bağdaştırıcısı oluşturur.
// Create a stream adapter with an 80 KB buffer.
Stream managedStream = nativeStream.AsStreamForRead(bufferSize: 81920);
Stream.CopyTo ve CopyToAsync yöntemleri de akışlar arasında kopyalama için yerel bir arabellek ayırır. AsStreamForRead uzantısı yönteminde olduğu gibi, varsayılan arabellek boyutunu geçersiz kılarak büyük akış kopyaları için daha iyi performans elde edebilirsiniz. Aşağıdaki kod örneği, CopyToAsync çağrısının varsayılan arabellek boyutunu değiştirmeyi gösterir.
MemoryStream destination = new MemoryStream();
// Copies the buffer into memory using the default copy buffer.
await managedStream.CopyToAsync(destination);
// Copy the buffer into memory using a 1 MB copy buffer.
await managedStream.CopyToAsync(destination, bufferSize: 1024 * 1024);
Bu örnekte, daha önce önerilen 80 KB'tan büyük olan 1 MB arabellek boyutu kullanılır. Böyle büyük bir arabellek kullanmak, çok büyük veri kümeleri (yani birkaç yüz megabayt) için kopyalama işleminin aktarım hızını iyileştirebilir. Ancak, bu arabellek büyük nesne yığınında yer alır ve çöp toplama performansını düşürebilir. Büyük arabellek boyutlarını yalnızca uygulamanızın performansını önemli ölçüde artırıyorsa kullanmanız gerekir.
Aynı anda çok sayıda akışla çalışırken, arabelleğin bellek yükünü azaltmak veya ortadan kaldırmak isteyebilirsiniz. Daha küçük bir arabellek belirtebilir veya bufferSize parametresini 0 olarak ayarlayarak bu akış bağdaştırıcısı için arabelleğe almayı tamamen kapatabilirsiniz. Yönetilen akışta büyük okuma ve yazma işlemleri gerçekleştirirseniz, arabellek kullanmadan da iyi bir aktarım hızı performansı elde edebilirsiniz.
Gecikme süresine duyarlı işlemler gerçekleştirme
Ayrıca, düşük gecikme süreli okuma ve yazma işlemleri yapmak ve temel alınan Windows Çalışma Zamanı akışının büyük bloklarında okumak istemiyorsanız arabelleğe almayı önlemek isteyebilirsiniz. Örneğin, akışı ağ iletişimleri için kullanıyorsanız düşük gecikme süreli okuma ve yazma işlemleri isteyebilirsiniz.
Sohbet uygulamasında, iletileri ileri geri göndermek için ağ arabirimi üzerinden bir akış kullanabilirsiniz. Bu durumda, iletileri hazır oldukları anda göndermek ve arabelleğin dolmasını beklememek istersiniz. AsStreamForRead, AsStreamForWrite ve AsStream uzantısı yöntemlerini çağırırken arabellek boyutunu 0 olarak ayarlarsanız, sonuçta elde edilen bağdaştırıcı bir arabellek ayırmaz ve tüm çağrılar temel alınan Windows Çalışma Zamanı akışını doğrudan işleyecek.
Windows developer