Version française
Home     About     Download     Resources     Contact us    
Browse thread
Instruction return
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Pierre Weis <Pierre.Weis@i...>
Subject: Re: Instruction return
> Cependant, j'ai rencontré la situation suivante dans un contexte
> où l'efficacité (à l'exécution) est essentielle.
> 
> Trouver l'indice du premier élément d'un tableau qui vérifie
> un prédicat p, s'il y en a un. 
> 
> Ce code étant compile avec l'option -unsafe, je ne peux pas
> compter sur les test de débordement des primitives Array.get ...
> 
> Le choix d'utiliser Array.unsafe_get serait inutile si j'inclus
> ce test de débordement dans la condition 
> du while ou de la fonction récursive ainsi:
> 
> let find p a =
>   let l = Array.length a in
>   let i = ref 0 in
>   while !i<l & not( p (Array.unsafe_get a !i) do
>   incr i
>   done;
>   !i
> 
> J'ai donc prefere le coût d'un try ... with:
> 
> exception Exit_for of int
>  let find p a =
>  let l = Array.length a in
>   try
>    for i = 0 to l-1 do
>     if p (Array.unsafe_get a i) then raise Exit_for i
>    done;
>    l
>   with Exit_for i -> i
[...]

As-tu fait des tests qui prouvent la supe'riorite' d'une version sur
l'autre ?

Comment crois-tu que la boucle for fait le bon nombre de tours puis
s'arre^te ? (En faisant un test a` chaque tour, et pratiquement le
me^me que celui de ta boucle while!).

English short version:

> But, due to runtime efficiency considerations I had to make
> the following choice.
> 
>  I want to find the index of the first item of an array which
> verifies a predicat p, if one exists. 
> 
> It is useless to prefer Array.unsafe_get if I add the test
> in the while (or recursive) condition as below:
> 
> let find p a =
>   let l = Array.length a in
>   let i = ref 0 in
>   while !i<l & not( p (Array.unsafe_get a !i) do
>   incr i
>   done;
>   !i
> 
> 
> I prefer to pay the cost of one try ... with ...
> 
> 
> exception Exit_for of int
>  let find p a =
>  let l = Array.length a in
>   try
>    for i = 0 to l-1 do
>     if p (Array.unsafe_get a i) then raise Exit_for i
>    done;
>    l
>   with Exit_for i -> i

Have you got some runtime figures that prove that this last version is more
efficient than the others ?

By the way, the for loop implies also a test each time its body is
executed (exactly the same as in your while loop) to decide to
continue or stop the loop...

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/