В приложении 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 значений прежде). Или это - что-то еще, как чтение из входного потока актива?
Спасибо за справку!
Не знаю об Android, но, по крайней мере, в JavaSE Scanner работает медленно.
Внутренне Scanner выполняет преобразование UTF-8, которое бесполезно в файле с плавающей точкой.
Поскольку все, что вам нужно, это читать числа с плавающей запятой из файла, вам следует использовать пакет java.io.
Ребята из SPOJ борются со скоростью ввода-вывода. Это польский сайт соревнований по программированию с очень сложными задачами. Их отличие в том, что они принимают более широкий спектр языков программирования, чем другие сайты, и во многих их проблемах ввод настолько велик, что, если вы не напишете эффективный ввод-вывод, ваша программа превысит ограничение по времени.
Посетите их форумы, например, здесь , чтобы узнать о пользовательском парсере.
Конечно, я советую не писать собственный парсер с плавающей запятой, но если вам нужна скорость, это все же решение.
Сканер
может быть частью проблемы, но вам нужно профилировать свой код, чтобы знать. Альтернативы могут быть быстрее. Вот простой тест , сравнивающий Scanner
и StreamTokenizer
.
Да я ничего подобного не вижу. Таким образом, я могу прочитать на рабочем столе около 10 миллионов поплавков за 4 секунды, но это не может быть так уж иначе.
Я пытаюсь придумать другие объяснения - возможно, это блокировка при чтении входного потока из getAssets ()? Я могу попробовать полностью прочитать этот ресурс, рассчитать время, а затем посмотреть, сколько дополнительного времени уходит на сканирование.
У меня точно такая же проблема. На чтение моего файла размером 18 КБ ушло 10 минут. В конце концов я написал настольное приложение, которое с помощью DataOutputStream преобразует эти удобочитаемые числа в машиночитаемый формат.
Результат был ошеломляющим.
Между прочим, когда я это отслеживал, большинство вызовов метода Scanner включает регулярные выражения, реализация которых обеспечивается пакетами com.ibm.icu. **
(проект IBM ICU). Это действительно перебор.
То же самое и для String.format . Избегайте этого в Android!