2013-06-05 6 views
1

Мне часто нужно разорвать петлю в OCaml, есть по крайней мере два способа:Перерыв петли в OCaml

(* by exception *) 
try 
    for i = 0 to 100 do 
    ... 
    if cond then raise BreakLoop 
    done; 
... 
with BreakLoop -> ... 

(* by while *) 
let cond = ref false in 
let i = ref 0 in 
while (not !cond) && (i<= 100) do 
    ... 
    i := !i + 1 
done; 
if !cond then ... 

То, что я забочусь больше всего является оптимизацией времени работы, до тех пор, как программа может быть легко читать и понимать. Способ while затрудняет цикл, когда имеется несколько вложенных циклов.

Я вижу, что где-то в Интернете люди заявляют, что бросать и ловить исключения в OCaml дорого. Может ли кто-нибудь подтвердить меня, если это правда?

Поэтому мы должны иногда использовать способ while, а иногда использовать способ exception?

+4

Возможно, вас заинтересует [это] (http://caml.inria.fr/mantis/view.php?id=5935) обсуждение. Кроме того, обратите внимание, что вы можете использовать исключение [Exit] (http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html#EXCEPTIONExit) вместо того, чтобы определять свой собственный. –

+5

Рассмотрите возможность использования хвостовой рекурсии: 'let rec loop i acc = if i> 100 || cond then acc else loop (i + 1) (f acc) '. Я не имею в виду «всегда делаю это». – lukstafi

+3

Вторичный. В вашем коде много ненужной изменчивости. Вместо использования цикла рассмотрим только выполнение рекурсивного вызова, если условие выполнено. –

ответ

4

По сравнению с другими языками, исключения очень быстро в OCaml (до тех пор, пока вы используете оригинальные компилятор. Вещи различны для js_of_ocaml, OCaml-Java и т.д.)

Однако раствор с compilicated while- петли все равно будут немного быстрее. Меня не волнуют минимальные различия в скорости, если код легче читать с исключениями - по крайней мере, в большинстве случаев.

+1

Они быстрей, пока вы не включаете стеки. – rgrinberg

Смежные вопросы