Я должен создать процессор данных, способный обрабатывать более 2 5 МБ/с входных данных от STDIN и выводить число в STDOUT. Что быстрее, использовать BufferedReader и затем преобразования в типы данных или Scanner и nextInt () или nextFloat ()?
РЕЗУЛЬТАТЫ ЭМПИРИЧЕСКОГО ТЕСТА: BufferedReader и преобразование немного быстрее, но ничего слишком значительного.
Спасибо!
-121--1850682-
Недавно я нашел презентацию о 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 - упс.
Итак, эта программа...
Почему?
ИЗМЕНИТЬ: Странность продолжается - Используя «-оптимизируют + - проверенный -», заставляет проблему исчезнуть, , но только под ArchLinux/Mono; в Windows XP и Windows 7/64bit даже оптимизированная версия двоичного стека переполняется.
Final EDIT : Ответ я нашел сам - см. ниже.