0

小さなファイルを大きなファイルにマージしました。アプリを最初に起動すると、このファイルが読み取られ、ファイル システム (Isolated Storage) に小さなファイルが 1 つずつ作成されます。

このファイルに 44 個の小さなファイルが含まれており、最大 200kb の場合、アルゴリズムはデバイス上で 120 ミリ秒動作します。このファイルに 140 個のさらに小さなファイルが含まれ、最大 400kb の場合、アルゴリズムはデバイス上で 3000 ミリ秒動作します。

両方のファイルから 44 ファイルしか取得しない場合、最初のファイルは 120 ミリ秒まで、2 番目のファイルは 800 ミリ秒まで機能します。

これは私にとって不思議に思えます。ファイル内のデータの形式は単純です

-INT32 - ENTRIES COUNT
--STRING ENTRY NAME         |
--INT32 ENTRY DATA LENGTH   |  REPEATS {ENTRY COUNT} TIMES
--BYTE[] ENTRY DATA         |

私にとって、これは Windows Phone の IsolatedStorage メカニズムの魔法のように思えます。同じ数のエントリをコピーする場合、2 番目のファイルの動作が 7 ~ 8 倍遅くなる理由はまったくありません。

再現プロジェクト - https://www.dropbox.com/s/6bjsve7p8wew3kb/IsoStorageWonder.zip?m

コード:

 public static void CopyCache(ILogger logger)
    {
        using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            var streamInfo = Application.GetResourceStream(new Uri(_dataFilePath, UriKind.RelativeOrAbsolute));

            isoStorage.CreateDirectory("HttpCache");

            var binaryReader = new BinaryReader(streamInfo.Stream);
            {
                int itemsCount = binaryReader.ReadInt32();

                for (int i = 0; i < ENTRIES_COUNT; i++)
                {
                    string fileName = binaryReader.ReadString();
                    int length = binaryReader.ReadInt32();
                    byte[] data = binaryReader.ReadBytes(length);

                    using (
                        var fileStream =
                            new IsolatedStorageFileStream(
                                Path.Combine(_rootCacheDir, fileName),
                                FileMode.Create,
                                FileAccess.Write,
                                FileShare.None,
                                isoStorage))
                    {
                        fileStream.Write(data, 0, data.Length);
                    }
                }
            }
        }
    }

マジック!

4

1 に答える 1

1

パフォーマンスにも同様の問題がありWebClientます。
エミュレータのリクエストでは 0.3 ~ 0.5 秒、デバイスでは 8 ~ 22 秒かかります。
私はとても混乱しました。
しかし、私の場合、解決策は非常に単純でした。デバッグモードでデバイスのパフォーマンスをテストしないでください。

私がやること:

  1. プロジェクトをデバイスにコンパイルします。
  2. デバッグを停止
  3. 電話でアプリを閉じます(デバイスを再起動することをお勧めします)
  4. すべてが魅力のように機能します))

テストアプリでIsoStorageWonder:

  1. エミュレータ551ms
  2. エミュレーター 256MB564ms
  3. HTC Radar WP7.8 デバッグ モード1835ms
  4. HTC Radar WP7.8 非デバッグ モード958ms

私の研究がお役に立てば幸いです。
よろしく

UPD

でテストoutput2

  1. エミュレータ440ms
  2. エミュレーター 256MB447ms
  3. HTC Radar WP7.8 デバッグ モード287ms // とてもいい
  4. HTC Radar WP7.8 Not Debug Mode 144ms// こちらもナイス
于 2013-04-26T14:11:01.097 に答える