Что является более быстрым в Java для чтения/разбора входных данных консоли, сканера или BufferedReader?

Я должен создать процессор данных, способный обрабатывать более 2 5 МБ/с входных данных от STDIN и выводить число в STDOUT. Что быстрее, использовать BufferedReader и затем преобразования в типы данных или Scanner и nextInt () или nextFloat ()?

РЕЗУЛЬТАТЫ ЭМПИРИЧЕСКОГО ТЕСТА: BufferedReader и преобразование немного быстрее, но ничего слишком значительного.

Спасибо!

-121--1850682-

F # vs OCaml: Stack overflow Недавно я нашел презентацию о F # для программистов Python, и посмотрев ее, решил реализовать решение «муравьиной головоломки» самостоятельно. Есть муравей, который может ходить по...

Недавно я нашел презентацию о F # для программистов Python , и посмотрев ее, решил реализовать решение «муравьиной головоломки» самостоятельно.

Существует муравей, который может ходить по плоской сетке. Муравей может перемещать по одному пространству за один раз влево, вправо, вверх или вниз. То есть из ячейки (x, y) муравей может перейти к клеткам (x + 1, y), (x-1, y), (x, y + 1) и (x, y-1). Точки, в которых сумма цифр координат x и y больше 25, недоступны для ant. Например, пункт (59,79) недоступен, так как 5 + 9 + 7 + 9 = 30, что больше 25. Вопрос в том, сколько точек может получить муравей, если он начинается с (1000, 1000), в том числе (1000, 1000) сам?

Я реализовал свое решение в 30 строках OCaml сначала , и опробовал его:

$ ocamlopt -unsafe -rectypes -inline 1000 -o puzzle ant.ml
$ time ./puzzle
Points: 148848

real    0m0.143s
user    0m0.127s
sys     0m0.013s

Аккуратный, мой результат такой же, как и в реализации леонардо, в D и C++ . По сравнению с реализацией С++ Леонардо, версия OCaml работает примерно в 2 раза медленнее, чем C++. Что нормально, учитывая, что Леонардо использовал очередь для удаления рекурсии.

Затем перевел код на F # ... и вот что у меня есть:

Thanassis@HOME /g/Tmp/ant.fsharp
$ /g/Program\ Files/FSharp-2.0.0.0/bin/fsc.exe ant.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

Thanassis@HOME /g/Tmp/ant.fsharp
$ ./ant.exe

Process is terminated due to StackOverflowException.
Quit

Thanassis@HOME /g/Tmp/ant.fsharp
$ /g/Program\ Files/Microsoft\ F#/v4.0/Fsc.exe ant.fs
Microsoft (R) F# 2.0 Compiler build 4.0.30319.1
Copyright (c) Microsoft Corporation. All Rights Reserved.

Thanassis@HOME /g/Tmp/ant.fsharp
$ ./ant.exe

Process is terminated due to StackOverflowException

Переполнение стека... с обеими версиями F # у меня в машине... Из любопытства, я затем взял сгенерированный двоичный (ant.exe) и запустить его под Arch Linux/Mono:

$ mono -V | head -1
Mono JIT compiler version 2.10.5 (tarball Fri Sep  9 06:34:36 UTC 2011)

$ time mono ./ant.exe
Points: 148848

real    1m24.298s
user    0m0.567s
sys     0m0.027s

Удивительно, что он работает под Mono 2.10.5 (то есть нет стека переполнения) - но он занимает 84 секунды, то есть в 587 раз медленнее, чем OCaml - упс.

Итак, эта программа...

  • работает нормально под OCaml
  • вообще не работает под .NET/F #
  • работает, но очень медленно, под Mono/F #.

Почему?

ИЗМЕНИТЬ: Странность продолжается - Используя «-оптимизируют + - проверенный -», заставляет проблему исчезнуть, , но только под ArchLinux/Mono; в Windows XP и Windows 7/64bit даже оптимизированная версия двоичного стека переполняется.

Final EDIT : Ответ я нашел сам - см. ниже.

61
задан ttsiodras 30 September 2011 в 13:38
поделиться