2013-04-25 3 views
0

Я объединил небольшие файлы в большой. При первом запуске приложения этот файл читается, и по файловой системе (изолированное хранилище) создается один за другим небольшие файлы.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!

+0

Я не уверен, как вы их тестируете, но я получаю согласованное 17ms (+/- 2ms) чтение из обоих файлов. –

+0

Ден, я думаю, что ты не ошибешься. Не следует использовать перечислитель, а не WP8, а WP7. Как я уже сказал, я вижу 120 мс на люмии 800. Интересно, как ты получил 17. – Grigory

+0

Григорий, я отправил свой ответ, а я тоже из Минска)). Оффтоп, извините. – jimpanzer

ответ

1

У меня есть аналогичная проблема с WebClient производительность.
В запросе эмулятора занимает 0,3-0,5 секунды, на устройстве - 8-22 секунды.
Я был очень смущен.
Но в моем случае решение было очень простым: НЕ ИСПЫТАТЬ ПРОИЗВОДИТЕЛЬНОСТЬ ПО УСТРОЙСТВУ В РЕЖИМЕ DEBUG.

Что я делаю:

  1. Compile проект на устройство.
  2. Stop Debugging
  3. Закройте приложение на телефоне (и лучше перезагрузки устройства)
  4. Все работает как шарм))

В тестовом приложении IsoStorageWonder:

  1. Emulator 551ms
  2. Эмулятор 256 мБ 564ms
  3. HTC R Адар WP7.8 Режим отладки 1835ms
  4. HTC Radar WP7.8 Не Режим отладки 958ms

Я надеюсь, что мои Reserch помочь вам.
С уважением

UPD

Тест с output2

  1. Emulator 440ms
  2. Emulator 256 Mб 447ms
  3. HTC Radar WP7.8 Режим отладки 287ms // очень хороший
  4. HTC Радар WP7.8 Не отладка e 144ms // также хорошо
+0

Спасибо за исследование! Не могли бы вы протестировать второй файл? Файл «output2». И разместите свои измерения времени здесь. Plz – Grigory

+0

Извините, но я могу проверить его только в понедельник ( – jimpanzer

+0

@Grigory, я обновил свой ответ – jimpanzer

Смежные вопросы