我需要尽快从隔离存储(IsolatedStorageFileStream)中读取文件。现在我按字节读取它。我确信读取大块字节会更快。但这些块的最佳尺寸是多少?有人做过这样的测试吗?
答案 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虚拟内存分配块,所以我敢打赌,其中一个值将为您提供最佳性能。当然闪存驱动程序也可能有一些关于它的说法 - 闪存扇区大小会产生影响,但写入可能比读取更多,因为它必须擦除和重写整个扇区,而不仅仅是你正在改变的字节。