Windows phone 7 Windows Phone隔离存储性能中的魔力
我把小文件合并成了大文件。在应用程序首次启动时,读取此文件,并在文件系统(独立存储)上逐个创建小文件 当该文件包含44个小文件且大小约为200kb时,该算法在设备上的运行时间为120ms。 当这个文件包含140个甚至更小的文件并且大约为400kb时,这个算法在设备上可以工作3000毫秒 如果我只从这两个文件中提取44个文件,第一个文件仍然可以工作约120毫秒,第二个文件可以工作约800毫秒 这对我来说似乎是个奇迹。 文件中的数据格式很简单Windows phone 7 Windows Phone隔离存储性能中的魔力,windows-phone-7,isolatedstorage,Windows Phone 7,Isolatedstorage,我把小文件合并成了大文件。在应用程序首次启动时,读取此文件,并在文件系统(独立存储)上逐个创建小文件 当该文件包含44个小文件且大小约为200kb时,该算法在设备上的运行时间为120ms。 当这个文件包含140个甚至更小的文件并且大约为400kb时,这个算法在设备上可以工作3000毫秒 如果我只从这两个文件中提取44个文件,第一个文件仍然可以工作约120毫秒,第二个文件可以工作约800毫秒 这对我来说似乎是个奇迹。 文件中的数据格式很简单 -INT32 - ENTRIES COUNT --STR
-INT32 - ENTRIES COUNT
--STRING ENTRY NAME |
--INT32 ENTRY DATA LENGTH | REPEATS {ENTRY COUNT} TIMES
--BYTE[] ENTRY DATA |
对我来说,这似乎是Windows Phone隔离存储机制中的一种魔力。
在复制相同数量的条目时,完全没有理由让第二个文件的速度慢7-8倍
重建计划-
代码:
publicstaticvoidcopycache(ILogger记录器)
{
使用(var isoStorage=IsolatedStorageFile.GetUserStoreForApplication())
{
var streamInfo=Application.GetResourceStream(新Uri(_dataFilePath,UriKind.RelativeOrAbsolute));
创建目录(“HttpCache”);
var binaryReader=新的binaryReader(streamInfo.Stream);
{
int itemscont=binaryReader.ReadInt32();
对于(int i=0;i
魔法 我在
WebClient
性能方面也有类似的问题。在模拟器中请求需要0.3-0.5秒,在设备上需要8-22秒<我很困惑
但在我的例子中,解决方案非常简单:不要在调试模式下测试Desive的性能。
我所做的:
IsoStorageWonder
:
551ms
564ms
1835ms
958ms
output2进行测试
模拟器440ms
模拟器256 mB447ms
HTC雷达WP7.8调试模式287ms
//非常好
HTC雷达WP7.8非调试模式144ms
//也不错
我不确定您是如何测试这些文件的,但我从这两个文件中得到了一致的17ms(+/-2ms)读数。Den,我认为您测试错了。不应使用枚举器,不应使用WP8,而应使用WP7。正如我所说,我在lumia 800上看到120ms。格里戈里,我把我的答案贴了出来,我也是明斯克人。很抱歉,非常感谢你的研究!你能用第二个文件测试一下吗?“output2”文件。请把你的时间测量结果贴在这里,但我只能在周一测试(
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);
}
}
}
}
}