java.util. Сканер это замедляется?

В приложении Android я хочу использовать класс чтения Сканера список плаваний от текстового файла (это - список координат вершины для OpenGL). Точный код:

Scanner in = new Scanner(new BufferedInputStream(getAssets().open("vertexes.off")));
final float[] vertexes = new float[nrVertexes];
for(int i=0;i<nrVertexFloats;i++){
    vertexes[i] = in.nextFloat();
}

Кажется однако, что это невероятно медленно (потребовалось 30 минут для чтения 10 000 плаваний!) - как протестировано на 2,1 эмуляторах. Что продолжается? Я не помню Сканер, чтобы быть, что медленный, когда я использовал его на ПК (истина быть сказанным я никогда не читал больше чем 100 значений прежде). Или это - что-то еще, как чтение из входного потока актива?

Спасибо за справку!

16
задан Cristian Vrabie 15 March 2010 в 11:47
поделиться

4 ответа

Не знаю об Android, но, по крайней мере, в JavaSE Scanner работает медленно.

Внутренне Scanner выполняет преобразование UTF-8, которое бесполезно в файле с плавающей точкой.

Поскольку все, что вам нужно, это читать числа с плавающей запятой из файла, вам следует использовать пакет java.io.

Ребята из SPOJ борются со скоростью ввода-вывода. Это польский сайт соревнований по программированию с очень сложными задачами. Их отличие в том, что они принимают более широкий спектр языков программирования, чем другие сайты, и во многих их проблемах ввод настолько велик, что, если вы не напишете эффективный ввод-вывод, ваша программа превысит ограничение по времени.

Посетите их форумы, например, здесь , чтобы узнать о пользовательском парсере.

Конечно, я советую не писать собственный парсер с плавающей запятой, но если вам нужна скорость, это все же решение.

8
ответ дан 30 November 2019 в 17:15
поделиться

Сканер может быть частью проблемы, но вам нужно профилировать свой код, чтобы знать. Альтернативы могут быть быстрее. Вот простой тест , сравнивающий Scanner и StreamTokenizer .

0
ответ дан 30 November 2019 в 17:15
поделиться

Да я ничего подобного не вижу. Таким образом, я могу прочитать на рабочем столе около 10 миллионов поплавков за 4 секунды, но это не может быть так уж иначе.

Я пытаюсь придумать другие объяснения - возможно, это блокировка при чтении входного потока из getAssets ()? Я могу попробовать полностью прочитать этот ресурс, рассчитать время, а затем посмотреть, сколько дополнительного времени уходит на сканирование.

0
ответ дан 30 November 2019 в 17:15
поделиться

У меня точно такая же проблема. На чтение моего файла размером 18 КБ ушло 10 минут. В конце концов я написал настольное приложение, которое с помощью DataOutputStream преобразует эти удобочитаемые числа в машиночитаемый формат.

Результат был ошеломляющим.

Между прочим, когда я это отслеживал, большинство вызовов метода Scanner включает регулярные выражения, реализация которых обеспечивается пакетами com.ibm.icu. ** (проект IBM ICU). Это действительно перебор.

То же самое и для String.format . Избегайте этого в Android!

0
ответ дан 30 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: