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
PRIVATE: Complexité de l'inférence de type et objets #3296
Comments
Comment author: administrator Bonjour, Le probleme que vous decrivez semble different du #3192. Je vais quand meme regarder si on ne peut pas faire mieux que ca. Jacques Garrigue |
1 similar comment
Comment author: administrator Bonjour, Le probleme que vous decrivez semble different du #3192. Je vais quand meme regarder si on ne peut pas faire mieux que ca. Jacques Garrigue |
Comment author: administrator Un collegue a ecrit pour moi un programme reproduisant le probleme Cuihtlauac ALVARADO a ecrit :
-----Message d'origine----- Bonjour, Le probleme que vous decrivez semble different du #3192. Je vais quand meme regarder si on ne peut pas faire mieux que ca. Jacques Garrigue <TITLE>RE: PRIVATE: Complexiti de l'infirence de type et objets (#3296)</TITLE> Un collegue a ecrit pour moi un programme reproduisant le probleme
Cuihtlauac ALVARADO a ecrit :
-----Message d'origine-----
Bonjour, Le probleme que vous decrivez semble different du #3192.
Je vais quand meme regarder si on ne peut pas faire mieux que ca. Jacques Garrigue ---------------- ---------------- ---------------- ---------------- |
Comment author: administrator Apres quelques recherches plus approfondies, il semblerait que le meme type class x = object and a0 = object inherit x end let _ = (new x :> x) Pensez-vous que l'ecriture de fonctions x_to_x, a0_to_x, ... du style let x_to_x : x -> x = fun o -> (Obj.magic o : x) puissent etre une solution envisageable pour mon probleme ? En effet, si une future version du compilateur s'averait plus veloce avec ce let a0_to_x : a0 -> x = fun a -> a :> x cela me permettrait de ne pas trop modifier le programme que j'ai commence a Merci d'avance. <TITLE>RE: PRIVATE: Complexiti de l'infirence de type et objets (#3296)</TITLE> Apres quelques recherches plus approfondies, il semblerait que le meme type de probleme soit rencontre avec : class x = object
and a0 = object inherit x end
let _ = (new x :> x) Pensez-vous que l'ecriture de fonctions x_to_x, a0_to_x, ... du style let x_to_x : x -> x = fun o -> (Obj.magic o : x) puissent etre une solution envisageable pour mon probleme ? En effet, si une future version du compilateur s'averait plus veloce avec ce genre de programme, il me suffirait de les reecrire sous la forme: let a0_to_x : a0 -> x = fun a -> a :> x cela me permettrait de ne pas trop modifier le programme que j'ai commence a ecrire (qui fait deja plus de 4000 lignes). Merci d'avance. ---------------- ---------------- ---------------- ---------------- |
Comment author: administrator
Cet exemple est beaucoup plus lisible. Si vous connaissez le type d'origine de la coercion, il faut utiliser une
Obj.magic n'est jamais une solution envisageable. let a0_to_x o = (o : a0 :> x) pour un cout d'inference negligeable. Cordialement, Jacques Garrigue |
1 similar comment
Comment author: administrator
Cet exemple est beaucoup plus lisible. Si vous connaissez le type d'origine de la coercion, il faut utiliser une
Obj.magic n'est jamais une solution envisageable. let a0_to_x o = (o : a0 :> x) pour un cout d'inference negligeable. Cordialement, Jacques Garrigue |
Comment author: administrator Inference speed problems with objects, modules and subtyping. |
Original bug ID: 1085
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
Full_Name: Michael Marchegay
Version: 3.04
OS: Linux - Solaris
Submission from: machine107.rd.francetelecom.com (193.49.124.107)
Je suis en train d'écrire un programme réalisant des opération sur un arbre dont
les noeuds sont représentés par des objets OCAML.
Tout marchait très bien jusau'à ce que j'ajoute à l'une de mes classe une
méthode prenant en paramètre des noeuds héritant de cette classe. L'ajout de
cette méthode semble avoir modifié la complexité de l'inférence de type pour les
fonction utilisant les classes de mon arbre.
La compilation de mon programme qui prenait une trentaine de secondes
auparavant, nécessite maintenant un peu plus d'une heure.
Je vous joint ci après le sequelète de mes classes, pratiquement épuré de toutes
leurs méthodes, ainsi qu'une petite fonction qui utilise ses classe.
La méthode qui fait augmenter mon temps de compilation est la méthode
collect_environment de la class child_node.
-------fichier.ml
module OS =
struct
type t = string
let compare (s1 : string) (s2 : string) = Pervasives.compare s1 s2
end
module OSO=
struct
type t = string option
let compare (s1 : string option) (s2 : string option) =
match (s1, s2) with
(None, None) -> 0
| (None, Some _) -> -1
| (Some _, None) -> 1
| (Some v1, Some v2) -> Pervasives.compare v1 v2
end
module MapString = Map.Make OS
module MapStringOption = Map.Make OSO
class virtual node =
object (self)
val mutable children : childNode list = []
end
and rootNode =
object (self)
inherit node
and virtual childNode (parent : node) =
object (self)
inherit node
(referenceableNode MapString.t) * (userTypeNode MapString.t)) MapStringOption.t
-> ((referenceableRefNode * string) list * (userTypeRefNode * string) list *
(referenceableNode MapString.t) * (userTypeNode MapString.t)) MapStringOption.t
(* should be List.fold_left (fun env (n : childNode) -> n#collect_environment
env) env children*)
end
and virtual typedNode (parent : node) =
object (self)
inherit childNode parent
end
and virtual typeBuilderNode (parent : node) =
object(self)
inherit typedNode parent
val mutable _content : typedNode option = None
content
and virtual userTypeNode (parent : node) =
object(self)
inherit typeBuilderNode parent
and virtual baseTypeNode (name : string) (parent : node) =
object(self)
inherit typedNode parent
end
and userTypeRefNode (name : string) (parent : node) =
object(self)
inherit baseTypeNode name parent
end
and virtual referenceableNode (parent : node) =
object
inherit typedNode parent
end
and virtual referenceableRefNode (parent : node) =
object
inherit typedNode parent
end
class stringTypeNode (base : string) (parent : node) =
object(self)
inherit baseTypeNode base parent
end
class integerTypeNode (base : string) (parent : node) =
object(self)
inherit baseTypeNode base parent
end
class booleanTypeNode (parent : node) =
object(self)
inherit baseTypeNode "boolean" parent
end
let getTypeForName : node -> string -> typedNode =
fun parent_node type_name ->
match type_name with
"string" as _type -> (new stringTypeNode _type parent_node :> typedNode)
typedNode)
-----fin fichier.ml
lorsque je compile ce morceau de fichier (avec ocamlc -c -pp ocamlp4o), la
compilation prend 1 min 11s sur mon sun. Par contre, si j'enlève la fonction
collect_environment, la compilation se fait en 0.66 s.
Si dans la fonction, je remplace les classes de noeud dérivées de node, par la
classe "node" elle-même, la compilation ne prend plus que 1 s.
Je voudrais donc savoir si cette augmentation de la complexité de l'inférence
est normale ?
Merci.
The text was updated successfully, but these errors were encountered: