【问题标题】:Magic in Windows Phone isolated storage performanceWindows Phone 隔离存储性能的魔力
【发布时间】:2013-04-25 16:41:39
【问题描述】:

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

当此文件包含 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);
                    }
                }
            }
        }
    }

魔法!

【问题讨论】:

  • 我不确定你是如何测试这些的,但我从两个文件中得到一致的 17 毫秒(+/- 2 毫秒)读数。
  • Den,我想你测试错了。不是枚举器,应该使用的不是 WP8,而是 WP7。正如我所说,我在 lumia 800 上看到 120 毫秒。我想知道你是如何得到 17 的。
  • Grigory,我发布了我的答案,我也来自明斯克))。 Offtop,对不起。

标签: windows-phone-7 isolatedstorage


【解决方案1】:

WebClient 的性能也有类似的问题。
在模拟器中请求需要 0.3-0.5 秒,在设备上需要 8-22 秒。
我很困惑。
但就我而言,解决方案非常简单:不要在调试模式下测试设备的性能。

我的工作:

  1. 将项目编译到您的设备。
  2. 停止调试
  3. 关闭手机上的应用(最好重启设备)
  4. 一切都像魅力一样))

在您的测试应用中IsoStorageWonder

  1. 模拟器551ms
  2. 模拟器 256 mB 564ms
  3. HTC Radar WP7.8 调试模式1835ms
  4. HTC Radar WP7.8 非调试模式958ms

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

UPD

output2测试

  1. 模拟器440ms
  2. 模拟器 256 mB 447ms
  3. HTC Radar WP7.8 调试模式287ms // 很好
  4. HTC Radar WP7.8 非调试模式 144ms // 也不错

【讨论】:

  • 感谢一百万的研究!你能用第二个文件测试吗? “输出2”文件。并在这里发布你的时间测量PLZ
  • 对不起,我只能在星期一测试它(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多