0

我已将小文件合并为大文件。在应用程序第一次启动时,会读取此文件,并在文件系统(隔离存储)上一个一个地创建小文件。

当此文件包含 44 个小文件并且约为 200kb 时 - 算法在设备上工作 120 毫秒。当此文件包含 140 个甚至更小的文件并且约为 400kb 时 - 算法在设备上工作 3000 毫秒。

如果我从这两个文件中只取 44 个文件 - 第一个文件仍然可以使用 ~120,第二个可以使用 ~800ms。

这对我来说似乎很奇怪。文件中数据的格式很简单

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

对我来说,这似乎是 Windows Phone 隔离存储机制中的一个魔法。在复制相同数量的条目时,完全没有理由让第二个文件慢 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. 模拟器 256 MB564ms
  3. HTC Radar WP7.8 调试模式1835ms
  4. HTC Radar WP7.8 非调试模式958ms

希望我的研究能帮到你。
问候

UPD

测试output2

  1. 模拟器440ms
  2. 模拟器 256 MB447ms
  3. HTC Radar WP7.8 调试模式287ms // 很不错
  4. HTC Radar WP7.8 Not Debug Mode 144ms// 也不错
于 2013-04-26T14:11:01.097 回答