Windows Phone быстрее всего читает из изолированного хранилища - PullRequest
0 голосов
/ 08 сентября 2011

Мне нужно прочитать файл из изолированного хранилища (IsolatedStorageFileStream) как можно быстрее. Теперь я читаю это за байт. Я уверен, что чтение кусков байтов будет быстрее. Но каков оптимальный размер этих кусков? Кто-нибудь делал такие тесты?

Ответы [ 4 ]

1 голос
/ 08 сентября 2011

Ну, я выполнил тест самостоятельно.Что у меня было: размер файла = 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 мс против 55734 мс, если позиция и длина указаны).

Какие обновленные результаты я получил:

размер буфера(байт) / время в эмуляторе (мс) / время на моем HTC Trophy (мс)1/1197/2370128/725/12891024/209/1634096/35/508196/35/49весь файл одновременно / 19/31

1 голос
/ 08 сентября 2011

Производительность ввода-вывода зависит от физического устройства, поэтому на ваш вопрос нет «магического числа».

Краткий ответ на ваш вопрос: прочитать весь файл в память по адресуодин раз, или если файл слишком большой (маловероятно, что мой телефон имеет 576 МБ ОЗУ = 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
{
    //...
}
0 голосов
/ 08 сентября 2011

В Windows CE используются блоки выделения страниц объемом 4 Кбайт и 64 Кбайт, поэтому я уверен, что одно из этих значений даст вам наилучшую производительность. Конечно, у флэш-драйвера тоже есть, что сказать по этому поводу - размер сектора флэш-памяти будет иметь значение, но, вероятно, больше на записи, чем на чтение, поскольку он должен стирать и перезаписывать весь сектор, а не только байт, который вы меняете.

0 голосов
/ 08 сентября 2011

(Отказ от ответственности: не тестируется на Windows Phone)

Как правило, чтение лучше всего выполнять в достаточном количестве, которое операционная система может предварительно загрузить.Однако API .NET может фактически выполнять буферизацию для вас, сохраняя системные вызовы в ядре.Эффект от этого трудно предсказать.

Производительность обычно лучше всего для области размером 16 384-65 535 байт для многих систем, хотя иногда может масштабироваться до диапазона 1 МБ +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...