Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
WinUI-alkalmazások létrehozása a Windows App SDK-val, amelyek hatékonyan férnek hozzá a fájlrendszerhez, elkerülve a lemezkés és a szükségtelen memória- vagy PROCESSZORhasználat által okozott teljesítményproblémákat.
Ha nagy fájlgyűjteményt szeretne elérni, és a tipikus Név, FileType és Elérési út tulajdonságoktól eltérő tulajdonságértékeket szeretne elérni, akkor a QueryOptions létrehozásával és a SetPropertyPrefetch meghívásával érheti el őket. A SetPropertyPrefetch metódus jelentősen javíthatja a fájlrendszerből beszerzett elemek gyűjteményét megjelenítő alkalmazások teljesítményét, például képek gyűjteményét. A következő példakészlet bemutatja, hogyan érhet el több fájlt.
Az első példa a Windows.StorageFolder.GetFilesAsync használatával kéri le a fájlok névinformációit. Ez a megközelítés jó teljesítményt nyújt, mert a példa csak a névtulajdonsághoz fér hozzá.
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;
}
A második példa a Windows.Storage.StorageFolder.GetFilesAsync parancsot használja, majd lekéri az egyes fájlok képtulajdonságait. Ez a megközelítés gyenge teljesítményt nyújt.
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;
}
A harmadik példa a QueryOptions használatával szerez be információkat egy fájlkészletről. Ez a megközelítés sokkal jobb teljesítményt nyújt, mint az előző példa.
// 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"];
}
Ha több műveletet hajt végre Például Windows.Storage-objektumokon Windows.Storage.ApplicationData.Current.LocalFolder, hozzon létre egy helyi változót, amely hivatkozik a tárolási forrásra, hogy ne hozza létre újra a köztes objektumokat minden alkalommal, amikor hozzáfér hozzá.
Streamteljesítmény C# nyelven
Pufferelés Windows-futtatókörnyezet és .NET-streamek között
Sok esetben előfordulhat, hogy windowsos futtatókörnyezeti streamet (például Windows.Storage.Streams.IInputStreamet vagy IOutputStreamet) szeretne .NET-streamké (System.IO.Stream) konvertálni. Ez például akkor hasznos, ha WinUI-alkalmazást ír, és meglévő .NET-kódot szeretne használni, amely a Windows Storage API-kkal működik streameken. Ennek engedélyezéséhez a .NET bővítménymetelyeket biztosít, amelyek lehetővé teszik a .NET és a Windows futtatókörnyezeti streamtípusok közötti konvertálást. További információ: WindowsRuntimeStreamExtensions.
Amikor windowsos futtatókörnyezeti streamet .NET-adatfolyammá alakít át, hatékonyan létrehoz egy adaptert a mögöttes Windows-futtatókörnyezeti streamhez. Bizonyos körülmények között futásidejű költségek merülnek fel a Windows futtatókörnyezeti streamek metódusainak meghívásával kapcsolatban. Ez befolyásolhatja az alkalmazás sebességét, különösen olyan esetekben, amikor sok kisebb, gyakori olvasási vagy írási műveletet hajt végre.
Az alkalmazások felgyorsítása érdekében a Windows futtatókörnyezet streamadapterei adatpuffert tartalmaznak. Az alábbi kódminta egy windowsos futtatókörnyezeti streamadapter alapértelmezett puffermérettel végzett kis egymást követő olvasásait mutatja be.
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);
}
Ez az alapértelmezett pufferelési viselkedés a legtöbb esetben kívánatos, amikor a Windows futtatókörnyezeti streamet .NET-adatfolyammá konvertálja. Bizonyos esetekben azonban érdemes lehet módosítani a pufferelési viselkedést a teljesítmény növelése érdekében.
Nagyméretű adatkészletek használata
Nagyobb adathalmazok olvasása vagy írása esetén növelheti az olvasási vagy írási átviteli sebességet, ha nagy pufferméretet biztosít az AsStreamForRead, az AsStreamForWrite és az AsStream bővítménymetelyek számára. Ez nagyobb belső pufferméretet ad a streamadapternek. Ha például egy nagy fájlból származó streamet egy XML-elemzőnek ad át, az elemző számos szekvenciális kis olvasást végezhet a streamből. A nagy puffer csökkentheti a mögöttes Windows-futtatókörnyezeti streamre irányuló hívások számát, és növelheti a teljesítményt.
Megjegyzés:
Ügyeljen arra, hogy körülbelül 80 KB-nál nagyobb pufferméretet állít be, mert ez töredezettséghez vezethet a szemétgyűjtő halomon. A kapcsolódó útmutatást a WinUI-alkalmazások szemétgyűjtési teljesítményének javítása című témakörben talál. Az alábbi példakód egy 81 920 bájtos pufferrel rendelkező felügyelt streamadaptert hoz létre.
// Create a stream adapter with an 80 KB buffer.
Stream managedStream = nativeStream.AsStreamForRead(bufferSize: 81920);
A Stream.CopyTo és a CopyToAsync metódusok helyi puffert is lefoglalnak a streamek közötti másoláshoz. Az AsStreamForRead bővítménymetódushoz hasonlóan az alapértelmezett pufferméret felülírásával jobb teljesítményt érhet el a nagy streammásolatok esetében. Az alábbi példakód egy CopyToAsync-hívás alapértelmezett pufferméretének módosítását mutatja be.
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);
Ez a példa egy 1 MB-os pufferméretet használ, amely nagyobb, mint a korábban javasolt 80 KB. Egy ilyen nagy puffer használata javíthatja a másolási művelet átviteli sebességét a nagyon nagy adathalmazok esetében (azaz több száz megabájt). Ez a puffer azonban a nagy objektum halomra van lefoglalva, és csökkentheti a szemétgyűjtés teljesítményét. Nagy pufferméreteket csak akkor érdemes használnia, ha jelentősen javítják az alkalmazás teljesítményét.
Ha egyszerre sok streamet használ, érdemes lehet csökkenteni vagy megszüntetni a puffer memóriaterhelését. Megadhat egy kisebb puffert, vagy beállíthatja a bufferSize paramétert 0 értékre, hogy teljesen kikapcsolja a pufferelést az adott streamadapter esetében. Nagy olvasások és írások végrehajtásával felügyelt adatfolyamon pufferelés nélkül is jó átviteli teljesítményt érhet el.
Késésre érzékeny műveletek végrehajtása
Érdemes lehet elkerülni a pufferelést is, ha alacsony késésű olvasásokat és írásokat szeretne, és nem szeretne nagy blokkokban olvasni az alapul szolgáló Windows-futtatókörnyezeti streamből. Előfordulhat például, hogy alacsony késésű olvasást és írást szeretne, ha hálózati kommunikációhoz használja a streamet.
Egy csevegőalkalmazásban egy hálózati felületen keresztüli stream használatával küldhet üzeneteket oda-vissza. Ebben az esetben azonnal el kell küldenie az üzeneteket, amint készen állnak, és nem várja meg, amíg a puffer megtelik. Ha a pufferméretet 0 értékre állítja az AsStreamForRead, az AsStreamForWrite és az AsStream bővítmény metódus meghívásakor, akkor az eredményül kapott adapter nem foglal le puffert, és minden hívás közvetlenül módosítja az alapul szolgáló Windows-futtatókörnyezeti streamet.
Windows developer