Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Array.sort et Sort.array #2997

Closed
vicuna opened this issue Oct 16, 2001 · 3 comments
Closed

Array.sort et Sort.array #2997

vicuna opened this issue Oct 16, 2001 · 3 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Oct 16, 2001

Original bug ID: 584
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Bonjour,

Juste une petite constatation qui me surprend ; mes excuses si ceci a
déjà été discuté.

Dans la documentation de caml, il est écrit que Sort.array est
obsolète et que Array.sort doit lui être préférée et est plus rapide.
Or le programme suivant :

======================================================================
let t = Array.init 1000000 (fun _ -> Random.int 1000000)
let _ = Array.sort/Sort.array compare t

compilé avec ocamlopt -unsafe, montre au contraire que Sort.array est
plus rapide (6.57 s) que Array.sort (8.49 s). Surprenant...

D'autre part, je note que dans le code de Array.sort, get et set sont
utilisées là où unsafe_get et unsafe_set pourraient l'être. De plus,
de façon surprenante, l'option -unsafe est sans effet sur les
performances (avec ou sans -unsafe on obtient 8.49 s).

Ne vous formalisez pas cependant, je n'ai nul besoin d'une fonction de
tri super-optimisée ; c'était juste une constatation faite en
passant...

Cordialement,

Jean-Christophe Filliatre (http://www.lri.fr/~filliatr)

@vicuna
Copy link
Author

vicuna commented Oct 16, 2001

Comment author: administrator

Dans la documentation de caml, il est écrit que Sort.array est
obsolète et que Array.sort doit lui être préférée et est plus rapide.

Bon, il faudrait ecrire "generalement plus rapide".

let t = Array.init 1000000 (fun _ -> Random.int 1000000)
let _ = Array.sort/Sort.array compare t

compilé avec ocamlopt -unsafe, montre au contraire que Sort.array est
plus rapide (6.57 s) que Array.sort (8.49 s). Surprenant...

Ca se discute... Avec Array.sort, on fait 25150766 comparaisons, alors
qu'on en fait 28900932 avec Sort.array. Si ta fonction de comparaison
est un peu plus compliquee, c'est Array.sort qui ira plus vite au chrono.

En plus, dans le cas le pire Array.sort ne degenere pas en n^2.

Evidemment, heap-sort ternaire ca a un peu d'overhead, mais je pense
que ca vaut le coup en termes de robustesse.

D'autre part, je note que dans le code de Array.sort, get et set sont
utilisées là où unsafe_get et unsafe_set pourraient l'être.

La il y a une vraie question: est-ce qu'on veut prendre le risque d'utiliser
unsafe_get et unsafe_set ? N'ayant pas prouve le code, je me demande si
la difference de vitesse justifie le risque de bug non detecte.

De plus,
de façon surprenante, l'option -unsafe est sans effet sur les
performances (avec ou sans -unsafe on obtient 8.49 s).

Est-ce que tu as vraiment recompile la librairie avec -unsafe ? Sur mon
alpha, il y a environ 20% de difference de vitesse sur ton programme.

-- Damien

@vicuna
Copy link
Author

vicuna commented Oct 16, 2001

Comment author: administrator

Est-ce qu'on doit utiliser unsafe_* ou non ?

@vicuna
Copy link
Author

vicuna commented Oct 16, 2001

Comment author: administrator

Merci pour ces précisions. (Je n'avais jamais vu de heap-sort
ternaire, d'ailleurs, et c'était intéressant de ce point de vue là.)

Pour répondre à ta question, j'avais bien recompilé la librairie en
-unsafe (en fait j'avais mis le code dans mon programme de test et
compilé en -unsafe pour être sûr).

Mais encore une fois, ce n'est pas très important. Merci d'avoir
répondu.

--
Jean-Christophe Filliatre (http://www.lri.fr/~filliatr)

@vicuna vicuna closed this as completed Oct 26, 2001
@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant