Windows手机从隔离存储中读取速度最快

时间:2011-09-07 20:34:42

标签: .net windows-phone-7

我需要尽快从隔离存储(IsolatedStorageFileStream)中读取文件。现在我按字节读取它。我确信读取大块字节会更快。但这些块的最佳尺寸是多少?有人做过这样的测试吗?

4 个答案:

答案 0 :(得分:1)

IO性能将根据物理设备而有所不同,因此您的问题没有“神奇数字”答案。

您的问题的简短答案是:立即将整个文件读入内存,或者如果文件太大(不太可能,我的手机有576MB RAM =我每月下载限制的1/4)那么请读取尽可能多的数据尽可能基于可用内存,处理它,然后再次阅读,等等。

// Obtain a virtual store for the application.
IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();

try
{
    // Specify the file path and options.
    using (var isoFileStream = new IsolatedStorageFileStream("MyFolder\\myFile.dat", FileMode.Open, myStore))
    {
        // Get the data size
        int length = (int)isoFileStream.Length;

        //TODO: Check file size vs. available memory and break up into chunks if needed

        // Create an in memory buffer
        char [] buffer = new char [length];

        // Read all of the data.
        using (var isoFileReader = new StreamReader(isoFileStream))
        {
            isoFileReader.ReadBlock(buffer, 0, length);
        }
    }
}
catch
{
    //...
}

答案 1 :(得分:1)

好吧,我自己进行了测试。我有什么: 文件大小= 3 803 264字节;测试代码段:

using (var file = storage.OpenFile("test.dat", FileMode.Open))
{
    var startTime = DateTime.Now;
    const int count = 1;
    var buffer = new byte[count];
    **long position = file.Position;
    **long length = file.Length;
    while (position < length)
    {
        file.Read(buffer, 0, count);
        position += count;
    }
    uxLog.Text = (DateTime.Now - startTime).TotalMilliseconds.ToString();
}

编辑:上面代码片段中非常重要的一点是file.Position和file.Length只被请求一次。它对性能有显着的积极影响(如果位置和长度内联,则计数= 1 2370 ms对55734 ms)。

我得到了哪些更新结果:

模拟器中的缓冲区大小(字节)/时间(ms)/ HTC Trophy上的时间(ms)
1/1197/2370
128/725/1289
1024/209 / 163
4096/35/50
8196/35/49
整个文件/ 19/31

答案 2 :(得分:0)

(免责声明:未在Windows Phone上测试)

通常,读取最好以足够的块执行,操作系统可以预加载。但是,.NET api实际上可能会为您执行缓冲,从而节省了对内核的系统调用。这种影响很难预测。

对于许多系统,性能通常最好在16,384-65,535字节区域附近,但有时可以扩展到1MiB +范围。

答案 3 :(得分:0)

Windows CE使用4k页面和64k虚拟内存分配块,所以我敢打赌,其中一个值将为您提供最佳性能。当然闪存驱动程序也可能有一些关于它的说法 - 闪存扇区大小会产生影响,但写入可能比读取更多,因为它必须擦除和重写整个扇区,而不仅仅是你正在改变的字节。