Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с функцией skip, Как заставить skip работать быстрее? 
:(
    Опции темы
Brodyaga
Дата 5.6.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

Цитата

Тут дело в том что эта операция очень ресурсоёмкая


Почему ты так думаешь? Делал какие-то конкретные замеры? Какие именно ресурсы так требует эта безобидная операция?


Конкретных замеров не делал, но просто при одном нажатии кнопки мне приходица делать около 50 подключений и отключений,  а то и болше
ПОэтому если их меньше работает всё ок, а если запросов около 50, то всё работает но жутко медленно... Вот на основе этого я и сделал такой вывод.

Цитата

От конкретной реализации JSR-75. В принципе, для файлов не составляет труда реализовать mark() на неограниченный размер и reset() без всяких буферов в памяти, просто используя платформенный seek(), - как раз то, что тебе нужно. Но вот реализовано это или нет - точно сказать нельзя, надо проверять в каждом конкретном случае. Для этого и придумали InputStream.markSupported().

А как тестить если на WTK-ашном эмуляторе markSupported выдаёт false? smile И вообще часто бывает такое что телефоны не подерживают markSupported или это редкость?
PM MAIL   Вверх
Dummy
Дата 5.6.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



На железке тестировать. Попробовать на разных версиях WTK, может, чего поменялось. Т. к. я работаю с вполне конкретными моделями телефонов, то не могу ответить уверенно, часто ли поддерживается mark().

Кстати, ты уверен, что узкое место при открытии нового потока - это именно открытие InputStream от файлового коннекшна, а не создание твоей обертки для skipTurbo()? Насколько я понял, в твоей обертке выделяется несколько килобайт буфера. Если это делать 50 раз подряд - получится долго. Можешь привести код (хотя бы конструктора) твоей обертки?

Это сообщение отредактировал(а) Dummy - 5.6.2008, 11:43
PM MAIL   Вверх
Brodyaga
Дата 5.6.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Код

//Класс переопределяющий поток чтения с возможностью пропуска большого количества байт
public class TurboDataInputStream extends DataInputStream 
{
    //Размер буфера данных
    private static final int SKIP_BUF_SIZE = 20480;
    
    //Конструктор задающий оборачиваемый поток InputStream
    public TurboDataInputStream(InputStream is)
    {
        super(is);
    }
    
    //Функция пропускает определённое количество байт
    public void skipTurbo(long n) throws IOException
    {
        long skipCount = n;
        int readBytes;
        
        byte[] skipBuffer = new byte[SKIP_BUF_SIZE];
        
        //Заполняем в цикле буфер, тем самым пропуская байты, пока не будет пропущено необходимое количество байт
        while (skipCount > 0)
        {
            //Заполняем буфер
            readBytes = this.read(skipBuffer, 0, (int) Math.min(SKIP_BUF_SIZE, skipCount));
            
            //Если из потока не было получено ни одного байта, то выходим из цикла
            if (readBytes < 0)
             break;
            
            //Уменьшаем нужное количество пропускаемых байт на пропущенные в данной итерации цикла
            skipCount -= readBytes;
        }
    }
}


Вот обёртка...
PM MAIL   Вверх
Dummy
Дата 5.6.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Код

dataInputStream=new DataInputStream(fileConnection.openInputStream());
dataInputStream.skipTurbo(fileConnection.fileSize()-4);
shiftFirst=dataInputStream.readIntCorrect();
dataInputStream.close();


Если у тебя по нажатию 50 раз выполняется такой вот код с той оберткой, что ты описал, то узкое место здесь вот это:

Код

byte[] skipBuffer = new byte[SKIP_BUF_SIZE];


Сделай skipBuffer статическим, тем более что данные из него все равно не используются.

Добавлено через 2 минуты и 53 секунды
Код

dataInputStream=new DataInputStream(fileConnection.openInputStream());
dataInputStream.skipTurbo(fileConnection.fileSize()-4);
shiftFirst=dataInputStream.readIntCorrect();
dataInputStream.close();


Если у тебя по нажатию 50 раз выполняется такой вот код с той оберткой, что ты описал, то узкое место здесь вот это:

Код

byte[] skipBuffer = new byte[SKIP_BUF_SIZE];


Сделай skipBuffer статическим, тем более что данные из него все равно не используются. 
PM MAIL   Вверх
Brodyaga
Дата 9.6.2008, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

Сделай skipBuffer статическим, тем более что данные из него все равно не используются.


Сделал.. ничего не изменилось.. мне кажеца узкое место в конекциях. Но ещё болшие тормоза вызывает перемещение по файлу скипом, тоесть основная проблема здесь:
Код

dataInputStream.skipTurbo(fileConnection.fileSize()-4);


Может увеличить размер буфера?
PM MAIL   Вверх
Dummy
Дата 9.6.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Вообще, и чтение из файла - операция небыстрая, так что мне кажется, стоит поэкспериментировать с размером буфера, возможно, увеличить, а возможно, уменьшить. Правда, в любом случае маловероятно, что один и тот же размер буфера будет одинаково подходит ко всем платформам.
PM MAIL   Вверх
Semplar
Дата 10.6.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.6.2008

Репутация: нет
Всего: нет



Да, я тоже сталкивался с такой проблемой. В моем случае - в том, что на одних платформах функция skip шустрее, а на других тормозит. Лично я в программе статически пробовал определить скорость одной и другой операции и выбрать, какая получше.
А вот чтение - операция действительно трудоемкая. Очень жаль, что не существует другого способа skip. Поленились сделать даже reset, чтобы не переоткрывать поток. Но, я щитаю, с этим ничего не поделаешь.
PM MAIL   Вверх
Brodyaga
Дата 16.6.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Ещё один вопрос.. Можно ли открыть два потока на файл? Например вот так:

Код

TurboDataInputStream t1;
TurboDataInputStream t2;

t1=new TurboDataInputStream(fileConnection.openInputStream());
t2=new TurboDataInputStream(fileConnection.openInputStream());


??
PM MAIL   Вверх
Dummy
Дата 16.6.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Вот здесь вот уже похожее обсуждалось. Вкратце - надеяться на то, что несколько потоков можно будет открыть, нельзя. И особого смысла в таком действии тоже тогда не нашли. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1078 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.