Я объединил небольшие файлы в большой. При первом запуске приложения этот файл читается, и по файловой системе (изолированное хранилище) создается один за другим небольшие файлы.Magic в Windows Phone изолированное хранилище
Когда этот файл содержит 44 небольших файла и составляет ~ 200kb - алгоритм работает на 120 мс на устройстве. Когда этот файл содержит 140 файлов меньшего размера и составляет ~ 400 кб - алгоритм работает на 3000 мс на устройстве.
Если я беру из обоих файлов только 44 файла - первый по-прежнему работает на ~ 120, второй работает на ~ 800 мс.
Это кажется мне удивительным. Формат данных в файле просто
-INT32 - ENTRIES COUNT
--STRING ENTRY NAME |
--INT32 ENTRY DATA LENGTH | REPEATS {ENTRY COUNT} TIMES
--BYTE[] ENTRY DATA |
Для меня это похоже на волшебство в механизмах Windows Phone IsolatedStorage. Нет никаких оснований для того, чтобы второй файл работал в 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);
}
}
}
}
}
MAGIC!
Я не уверен, как вы их тестируете, но я получаю согласованное 17ms (+/- 2ms) чтение из обоих файлов. –
Ден, я думаю, что ты не ошибешься. Не следует использовать перечислитель, а не WP8, а WP7. Как я уже сказал, я вижу 120 мс на люмии 800. Интересно, как ты получил 17. – Grigory
Григорий, я отправил свой ответ, а я тоже из Минска)). Оффтоп, извините. – jimpanzer