Je vois un peu mieux le principe du borrow checker, je regarderai peu être plus en détail la façon dont Rust gère les références. Cela étant, au début de Rust il y avait un GC qu'ils ont abandonné, mais l'idée de remettre de la gestion automatique est toujours présente, cela semble être néanmoins compliqué. Il y a deux articles sur le sujet sur le blog d'un des membres de l'équipe du compilateur :
Sinon quelle différence fais-tu entre un langage qui peut faire de la programmation système et un langage système ? Il y a des personnes qui écrivent des noyaux, sous la forme d'unikernel, en OCaml :
MirageOS is a library operating system that constructs unikernels for secure, high-performance network applications across a variety of cloud computing and mobile platforms. Code can be developed on a normal OS such as Linux or MacOS X, and then compiled into a fully-standalone, specialised unikernel that runs under the Xen hypervisor.
Il y a bien des problèmes de latence liés au GC qui peuvent apparaître (contrairement à la gestion totalement manuelle du C par exemple) mais cela se gère aussi en adaptant son fonctionnement à l'application. Je ne connais pas le fonctionnement du GC de Haskell (mais d'après l'article c'est similaire à celui de OCaml), mais pour celui de OCaml ce chapitre de Real World OCaml en détail bien le fonctionnement.
Le premier commentaire de l'article que tu cites renvoie sur un benchmark (dont je n'ai pas estimé la pertinence) qui mesure la latence d'un serveur web qui stocke une hashtable (pour le serveur web en OCaml, il utilise d'ailleurs une bibliothèque développée par l'équipe de MirageOS) :
benchresult
J'ai eu une polémique récemment sur le coup de la latence du GC de OCaml en rapport à ce benchmark du benchmarkgame de chez Debian. J'avais mal estimé le rôle du GC dans les mauvais résultats : comme pour le cas de ton article, il y a des objets trop gros qui restent vivants trop longtemps. En adaptant la taille de la minor heap on obtient de meilleurs résultats (j'utilise aussi la bibliothèque functory, qui fait une sorte de MapReduce, pour le parallélisme ) :
openFunctory.Coreslet()=set_number_of_cores4letset_minor_heapsize=Gc.set{(Gc.get())withGc.minor_heap_size=size}typetree=Empty|Nodeoftree*int*treeletrecmakeid=ifd=0thenNode(Empty,i,Empty)elseleti2=2*iandd=d-1inNode(make(i2-1)d,i,makei2d)letreccheck=functionEmpty->0|Node(l,i,r)->i+checkl-checkrletmin_depth=4letmax_depth=letn=tryint_of_string(Array.getSys.argv1)with_->10inmax(min_depth+2)n(** c'est ici que j'adapte la taille de la minor heap * ce qui évite de nombreuse copie entre la minor et la major heap* et réduit grandement la latence due au GC *)let()=set_minor_heap(8lslmax_depth)letstretch_depth=max_depth+1let()=letc=check(make0stretch_depth)inPrintf.printf"stretch tree of depth %i\t check: %i\n"stretch_depthcletlong_lived_tree=make0max_depthletworker(niter,d)=letc=ref0infori=1toniterdoGc.minor();c:=!c+check(makeid)+check(make(-i)d)done;!clet()=flushstdout;lettasks=letl=ref[]infori=((max_depth-min_depth)/2+1)-1downto0doletd=min_depth+i*2inletniter=1lsl(max_depth-d+min_depth)inl:=((niter,d),None)::!ldone;!linletres=ref[]inletmaster((niter,d),_)c=res:=(2*niter,d,c)::!res;[]in(* il n'y a plus de major collection pendant ce calcul *)compute~worker~mastertasks;letlog(niter,d,c)=lets=Printf.sprintf"%i\t trees of depth %i\t check: %i"niterdcinprint_endlines;inList.iterlog(List.sort(fun(_,d,_)(_,d',_)->comparedd')!res);Printf.printf"long lived tree of depth %i\t check: %i\n"max_depth(checklong_lived_tree)
avec ce code, sur ma machine à 4 cœurs, j'obtiens comme résultat standard avec un time btree 20 :
real 0m5.411s
user 0m16.320s
sys 0m0.492s
là où avec le code C le plus performant je suis dans cet ordre de grandeur :
real 0m3.721s
user 0m13.144s
sys 0m0.204s
c'est pas si mal et bien mieux que le 25.82 s du meilleur code OCaml du test. D'autant que, n'étant pas moi même programmeur (je suis mathématicien et logicien, pas informaticien), il est fort probable qu'un spécialiste du langage puisse encore améliorer cela.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.
[^] # Re: On s'en bat le steak
Posté par kantien . En réponse au journal Typage statique pour Python. Évalué à 1. Dernière modification le 05 juin 2016 à 10:38.
Je vois un peu mieux le principe du borrow checker, je regarderai peu être plus en détail la façon dont Rust gère les références. Cela étant, au début de Rust il y avait un GC qu'ils ont abandonné, mais l'idée de remettre de la gestion automatique est toujours présente, cela semble être néanmoins compliqué. Il y a deux articles sur le sujet sur le blog d'un des membres de l'équipe du compilateur :
Sinon quelle différence fais-tu entre un langage qui peut faire de la programmation système et un langage système ? Il y a des personnes qui écrivent des noyaux, sous la forme d'unikernel, en OCaml :
Il y a bien des problèmes de latence liés au GC qui peuvent apparaître (contrairement à la gestion totalement manuelle du C par exemple) mais cela se gère aussi en adaptant son fonctionnement à l'application. Je ne connais pas le fonctionnement du GC de Haskell (mais d'après l'article c'est similaire à celui de OCaml), mais pour celui de OCaml ce chapitre de Real World OCaml en détail bien le fonctionnement.
Le premier commentaire de l'article que tu cites renvoie sur un benchmark (dont je n'ai pas estimé la pertinence) qui mesure la latence d'un serveur web qui stocke une hashtable (pour le serveur web en OCaml, il utilise d'ailleurs une bibliothèque développée par l'équipe de MirageOS) :
benchresult
J'ai eu une polémique récemment sur le coup de la latence du GC de OCaml en rapport à ce benchmark du benchmarkgame de chez Debian. J'avais mal estimé le rôle du GC dans les mauvais résultats : comme pour le cas de ton article, il y a des objets trop gros qui restent vivants trop longtemps. En adaptant la taille de la minor heap on obtient de meilleurs résultats (j'utilise aussi la bibliothèque functory, qui fait une sorte de MapReduce, pour le parallélisme ) :
avec ce code, sur ma machine à 4 cœurs, j'obtiens comme résultat standard avec un
time btree 20:là où avec le code C le plus performant je suis dans cet ordre de grandeur :
c'est pas si mal et bien mieux que le
25.82 sdu meilleur code OCaml du test. D'autant que, n'étant pas moi même programmeur (je suis mathématicien et logicien, pas informaticien), il est fort probable qu'un spécialiste du langage puisse encore améliorer cela.Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.