From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id 35100BC6B for ; Fri, 14 Dec 2007 15:54:58 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAANcnYkdA6ba5i2dsb2JhbACQAwEBAQgEBBMRBZlW X-IronPort-AV: E=Sophos;i="4.24,168,1196636400"; d="ml'?scan'208";a="20324837" Received: from nf-out-0910.google.com ([64.233.182.185]) by mail4-smtp-sop.national.inria.fr with ESMTP; 14 Dec 2007 15:54:57 +0100 Received: by nf-out-0910.google.com with SMTP id e27so914954nfd.13 for ; Fri, 14 Dec 2007 06:54:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; bh=k8CXCIzXxolLt5MFJU3JOYj2UXc8ixTzjbd0qBv+c64=; b=s7MTy1eV7k16Afzaz6F98h+KLUhz1Ixq1pxrq2tau7V3Zw20sTDF25EWGia3TIeIHVhm0kzd1WzqoiY5xfAa3oddXJ6OYoB2nNW0dnFP4m2YPZjaFjMz0sc+5ht9mKrlQLuWJPBO50zqj3Mq+zPrtAWy8oHuirOe39yojFDAxEY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=fV3y18sZrM+LxOp3tuqyjtCFuRzI5oZT8oZdSLRews8ZonV/wfqm8jXc3WMQQDtmY2GZ2CXgqjCZ01yw90bnIqYrXNq8ilfztgi+0fgLbwunVESHX9KxZ/eJB5zpQYc1AYCJndfKYCj2n0C/YbIjUy3nQO7c227hyNvigvWZuGo= Received: by 10.82.121.15 with SMTP id t15mr8492832buc.26.1197644095506; Fri, 14 Dec 2007 06:54:55 -0800 (PST) Received: by 10.82.154.16 with HTTP; Fri, 14 Dec 2007 06:54:55 -0800 (PST) Message-ID: <6cb897b30712140654v26a0ef96we6007c868d3d1829@mail.gmail.com> Date: Fri, 14 Dec 2007 15:54:55 +0100 From: "Pierre-Evariste Dagand" To: "Zheng Li" , caml-list@yquem.inria.fr Subject: Re: [Caml-list] Re: "Ref" and copy of functions In-Reply-To: <87d4t9k0uy.fsf@pps.jussieu.fr> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_1227_27773700.1197644095452" References: <6cb897b30712130927m7df88e3axec56eacba4d47fdf@mail.gmail.com> <87d4t9k0uy.fsf@pps.jussieu.fr> X-Spam: no; 0.00; mutable:01 gettimeofday:01 gettimeofday:01 printf:01 printf:01 microseconds:01 microseconds:01 ocamlopt:01 -rectypes:01 haskell:01 0.75:98 wrote:01 unix:01 unix:01 rec:01 X-Attachments: type="application/octet-stream" name="measure_ref.ml" name="measure_ref.ml" type="application/octet-stream" name="measure_rectypes.ml" name="measure_rectypes.ml" type="application/octet-stream" name="measure_pure_cps.ml" name="measure_pure_cps.ml" ------=_Part_1227_27773700.1197644095452 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, > At least on this > particular example, you can use the following encoding (I > deliberately use rectypes here, but you can always use extra > variant instead) > > (...) > > Since it doesn't use mutable variable, it's free to make copy. Yes, that's a CPS-way of doing things. I am aware of it and my first implementation was in this style. The reasons why I decided to switch to Ref were that : 1/ The implementation is much more "intuitive" (I don't have a CPS pre-processor in my brain) 2/ I thought I could get rid of my hack (Marshal/UnMarshal) easily 3/ I used to think that I will be faster Point 1 is not a problem, Santa Claus might bring me this CPS pre-processor in a few days. Point 2 seems to be wrong : being fast is nice but if it's for hitting the wall, well... one should slow down. And for the moment, I haven't found a clean solution and I'm not sure whether my hack is safe or not. So, remains point 3. That's why I have carried out an experience on my initial Ref implementation, your Rectypes implementation and a CPS implementation without rectypes (because rectypes frighten me). %%%%%%%%%%%%%%%%%%% ---------------------------- Ref implementation : ---------------------------- type ('a,'b) arrow = Arrow of ( 'a -> 'b ) let arr f = Arrow ( f ) let (>>>) (Arrow f) (Arrow g) =Arrow ( fun c -> g ( f c ) ) let loop init (Arrow f) = let state = ref init in Arrow ( fun c -> let new_state , output = f ( !state , c ) in state := new_state; output ) let run (Arrow f) input = f input ----------------------------------- Rectypes implementation : ------------------------------------ let rec arr f x = f x, arr f let rec (>>>) f g x = let rf,nf = f x in let rg,ng = g rf in rg, nf >>> ng let rec run f x ?(i=0) max_inc = if i = max_inc then x else let _,n = f x in run n x ~i:(i+1) max_inc -------------------------------------- Variant CPS implementation : -------------------------------------- type ('a,'b) arrow = Arrow of ( 'a -> 'b * ('a,'b) arrow ) let rec arr f = Arrow ( fun x -> f x , arr f );; let rec (>>>) (Arrow f) (Arrow g) = Arrow ( fun x -> let rf,nf = f x in let rg,ng = g rf in rg , nf >>> ng ) let loop init f = let rec loop_aux c (Arrow f) = Arrow ( fun x-> let ((c', r), n) = f (c,x) in r , loop_aux c' n ) in loop_aux init f let rec run (Arrow f) x ?(i=0) max_inc = if i = max_inc then x else let _,n = f x in run n x ~i:(i+1) max_inc %%%%%%%%%%%%%%%%%%%%% Then I wrote a small test : %%%%%%%%%%%%%%%%%%%%% let pair_to_simple (x,y) = x let arr_pair_to_simple () = arr pair_to_simple let simple_to_pair x = (x,x) let arr_simple_to_pair () = arr simple_to_pair let arr_incr = arr ( fun ( c , x ) -> c + 1 , c + x ) let arr_counter1 = loop 1 arr_incr let arr_incr1 = (arr_pair_to_simple ()) >>> arr_counter1 >>> (arr_simple_to_pair ()) let arr_counter2 = loop 2 arr_incr1 let arr_incr2 = (arr_pair_to_simple ()) >>> arr_counter2 >>> (arr_simple_to_pair ()) let arr_counter3 = loop 3 arr_incr2 let arr_incr3 = (arr_pair_to_simple ()) >>> arr_counter3 >>> (arr_simple_to_pair ()) let arr_counter4 = loop 4 arr_incr3 let arr_incr4 = (arr_pair_to_simple ()) >>> arr_counter4 >>> (arr_simple_to_pair ()) let arr_counter5 = loop 5 arr_incr4 let arr_incr5 = (arr_pair_to_simple ()) >>> arr_counter5 >>> (arr_simple_to_pair ()) let arr_counter6 = loop 6 arr_incr5 let arr_incr6 = (arr_pair_to_simple ()) >>> arr_counter6 >>> (arr_simple_to_pair ()) let arr_counter7 = loop 7 arr_incr6 let arr_incr7 = (arr_pair_to_simple ()) >>> arr_counter7 >>> (arr_simple_to_pair ()) let arr_counter8 = loop 8 arr_incr7 let arr_incr8 = (arr_pair_to_simple ()) >>> arr_counter8 >>> (arr_simple_to_pair ()) let arr_counter9 = loop 9 arr_incr8 let arr_incr9 = (arr_pair_to_simple ()) >>> arr_counter9 >>> (arr_simple_to_pair ()) let arr_counter10 = loop 10 arr_incr9 let arr_incr10 = (arr_pair_to_simple ()) >>> arr_counter10 >>> (arr_simple_to_pair ()) let arr_counter11 = loop 11 arr_incr10 let arr_incr11 = (arr_pair_to_simple ()) >>> arr_counter11 >>> (arr_simple_to_pair ()) let arr_counter12 = loop 12 arr_incr11 let arr_incr12 = (arr_pair_to_simple ()) >>> arr_counter12 >>> (arr_simple_to_pair ()) let arr_my_arrow () = ( arr_simple_to_pair () ) >>> arr_incr12 %%%%%%%%%%%%%%%%%%%%%%%% Finally, I measured the processing time with : %%%%%%%%%%%%%%%%%%%%%%%% ------------- For Ref ------------- let _ = let ntest = 100000 in let start_time = Unix.gettimeofday () in let arr_my_arrow = arr_my_arrow () in for i=0 to ntest-1 do let _ = run arr_my_arrow 2 in () done; let end_time = Unix.gettimeofday () in let time = ( end_time -. start_time ) /. (float_of_int ntest) *. 1000000.0 in Printf.printf "Mean processing time : %f microseconds\n" time; -------------------- For CPS (both) -------------------- let _ = let ntest = 100000 in let arr_my_arrow = arr_my_arrow () in let start_time = Unix.gettimeofday () in let _ = run arr_my_arrow 2 ntest in (); let end_time = Unix.gettimeofday () in let time = ( end_time -. start_time ) /. (float_of_int ntest) *. 1000000.0 in Printf.printf "Mean processing time : %f microseconds\n" time; %%%%%%%%%%%%%%%%%%%%%%%%%%%% And the results are ... 1/ Ref : 0.75 microseconds 2/ Variant CPS : 2.69 microseconds 3/ Rectypes : 2.80 microseconds [ compiled with ocamlopt.opt, with -rectypes for 3/ ] It's about 4 times longer and, against a C++ code, I fear that I can't afford it. > It looks like "arrow" is for some kind of flow-like > programming, then you may also take a look at SDFlow [1]. Yes, it does. For more info : http://www.haskell.org/arrows/ I will take a look at SDFlow, thanks for the hint. > HTH. Thanks, -- Pierre-Evariste DAGAND ------=_Part_1227_27773700.1197644095452 Content-Type: application/octet-stream; name=measure_ref.ml Content-Transfer-Encoding: base64 X-Attachment-Id: f_fa6u6b5f Content-Disposition: attachment; filename=measure_ref.ml dHlwZSAoJ2EsJ2IpIGFycm93ID0gQXJyb3cgb2YgKCAnYSAtPiAnYiApCgpsZXQgYXJyIGYgPSBB cnJvdyAoICBmICkKCmxldCAoPj4+KSAoQXJyb3cgZikgKEFycm93IGcpID0KICBBcnJvdyAoIAog ICAgZnVuICBjIC0+CiAgICAgIGcgICggZiAgYyApCiAgKQoKbGV0IGxvb3AgaW5pdCAoQXJyb3cg ZikgPSAKICBsZXQgc3RhdGUgPSByZWYgaW5pdCBpbgogICAgQXJyb3cgKAogICAgICBmdW4gYyAt PgoJbGV0IG5ld19zdGF0ZSAsIG91dHB1dCA9IGYgKCAhc3RhdGUgLCBjICkgaW4KCSAgc3RhdGUg Oj0gbmV3X3N0YXRlOwoJICBvdXRwdXQKICAgICkKCmxldCBydW4gKEFycm93IGYpIGlucHV0ID0K ICBmICBpbnB1dAoKCgpsZXQgcGFpcl90b19zaW1wbGUgKHgseSkgPSB4CmxldCBhcnJfcGFpcl90 b19zaW1wbGUgKCkgPSBhcnIgcGFpcl90b19zaW1wbGUKCmxldCBzaW1wbGVfdG9fcGFpciB4ID0g KHgseCkKbGV0IGFycl9zaW1wbGVfdG9fcGFpciAoKSA9IGFyciBzaW1wbGVfdG9fcGFpcgoKbGV0 IGFycl9pbmNyID0gYXJyICggZnVuICggYyAsIHggKSAtPiBjICsgMSAsIGMgKyB4ICkKCmxldCBh cnJfY291bnRlcjEgPSBsb29wIDEgYXJyX2luY3IKbGV0IGFycl9pbmNyMSA9IChhcnJfcGFpcl90 b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjEgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkp CgpsZXQgYXJyX2NvdW50ZXIyID0gbG9vcCAyIGFycl9pbmNyMQpsZXQgYXJyX2luY3IyID0gKGFy cl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFycl9jb3VudGVyMiA+Pj4gKGFycl9zaW1wbGVfdG9f cGFpciAoKSkKCmxldCBhcnJfY291bnRlcjMgPSBsb29wIDMgYXJyX2luY3IyCmxldCBhcnJfaW5j cjMgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXIzID4+PiAoYXJyX3Np bXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVyNCA9IGxvb3AgNCBhcnJfaW5jcjMKbGV0 IGFycl9pbmNyNCA9IChhcnJfcGFpcl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjQgPj4+ IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX2NvdW50ZXI1ID0gbG9vcCA1IGFycl9p bmNyNApsZXQgYXJyX2luY3I1ID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFycl9jb3Vu dGVyNSA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjYgPSBsb29w IDYgYXJyX2luY3I1CmxldCBhcnJfaW5jcjYgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4g YXJyX2NvdW50ZXI2ID4+PiAoYXJyX3NpbXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVy NyA9IGxvb3AgNyBhcnJfaW5jcjYKbGV0IGFycl9pbmNyNyA9IChhcnJfcGFpcl90b19zaW1wbGUg KCkpID4+PiBhcnJfY291bnRlcjcgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJy X2NvdW50ZXI4ID0gbG9vcCA4IGFycl9pbmNyNwpsZXQgYXJyX2luY3I4ID0gKGFycl9wYWlyX3Rv X3NpbXBsZSAoKSkgPj4+IGFycl9jb3VudGVyOCA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkK CmxldCBhcnJfY291bnRlcjkgPSBsb29wIDkgYXJyX2luY3I4CmxldCBhcnJfaW5jcjkgPSAoYXJy X3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXI5ID4+PiAoYXJyX3NpbXBsZV90b19w YWlyICgpKQoKbGV0IGFycl9jb3VudGVyMTAgPSBsb29wIDEwIGFycl9pbmNyOQpsZXQgYXJyX2lu Y3IxMCA9IChhcnJfcGFpcl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjEwID4+PiAoYXJy X3NpbXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVyMTEgPSBsb29wIDExIGFycl9pbmNy MTAKbGV0IGFycl9pbmNyMTEgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50 ZXIxMSA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjEyID0gbG9v cCAxMiBhcnJfaW5jcjExCmxldCBhcnJfaW5jcjEyID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkg Pj4+IGFycl9jb3VudGVyMTIgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX215 X2Fycm93ICgpID0gKCBhcnJfc2ltcGxlX3RvX3BhaXIgKCkgKSA+Pj4gYXJyX2luY3IxMjs7CgoK bGV0IF8gPQogIGxldCBudGVzdCA9ICAxMDAwMDAgaW4KICBsZXQgc3RhcnRfdGltZSA9IFVuaXgu Z2V0dGltZW9mZGF5ICgpIGluCiAgbGV0IGFycl9teV9hcnJvdyA9IGFycl9teV9hcnJvdyAoKSBp bgogICAgZm9yIGk9MCB0byBudGVzdC0xIGRvCiAgICAgIGxldCBfID0gcnVuIGFycl9teV9hcnJv dyAyIGluCgkoKQogICAgZG9uZTsKICAgIGxldCBlbmRfdGltZSA9IFVuaXguZ2V0dGltZW9mZGF5 ICgpIGluCiAgICBsZXQgdGltZSA9ICggZW5kX3RpbWUgLS4gc3RhcnRfdGltZSApIC8uIChmbG9h dF9vZl9pbnQgbnRlc3QpICouIDEwMDAwMDAuMCBpbgogICAgICBQcmludGYucHJpbnRmICJNZWFu IHByb2Nlc3NpbmcgdGltZSA6ICVmIG1pY3Jvc2Vjb25kc1xuIiB0aW1lOwo= ------=_Part_1227_27773700.1197644095452 Content-Type: application/octet-stream; name=measure_rectypes.ml Content-Transfer-Encoding: base64 X-Attachment-Id: f_fa6u8fue Content-Disposition: attachment; filename=measure_rectypes.ml bGV0IHJlYyBhcnIgZiB4ID0gZiB4LCBhcnIgZjs7CgpsZXQgcmVjICg+Pj4pIGYgZyB4ID0KICBs ZXQgcmYsbmYgPSBmIHggaW4gbGV0IHJnLG5nID0gZyByZiBpbgogcmcsIG5mID4+PiBuZzs7Cgps ZXQgcmVjIGxvb3AgaW5pdCBmIHggPQogIGxldCAoKGluaXQnLCByKSwgbikgPSBmIChpbml0LHgp IGluCiByLCBsb29wIGluaXQnIG47OwoKbGV0IHJlYyBydW4gZiB4ID8oaT0wKSBtYXhfaW5jID0g CiAgaWYgaSA9IG1heF9pbmMgdGhlbgogICAgeAogIGVsc2UKICAgIGxldCBfLG4gPSBmIHggaW4K ICAgICAgcnVuIG4geCB+aTooaSsxKSBtYXhfaW5jCgkKCmxldCBwYWlyX3RvX3NpbXBsZSAoeCx5 KSA9IHgKbGV0IGFycl9wYWlyX3RvX3NpbXBsZSAoKSA9IGFyciBwYWlyX3RvX3NpbXBsZQoKbGV0 IHNpbXBsZV90b19wYWlyIHggPSAoeCx4KQpsZXQgYXJyX3NpbXBsZV90b19wYWlyICgpID0gYXJy IHNpbXBsZV90b19wYWlyCgpsZXQgYXJyX2luY3IgPSBhcnIgKCBmdW4gKCBjICwgeCApIC0+IGMg KyAxICwgYyArIHggKQoKbGV0IGFycl9jb3VudGVyMSA9IGxvb3AgMSBhcnJfaW5jcgpsZXQgYXJy X2luY3IxID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFycl9jb3VudGVyMSA+Pj4gKGFy cl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjIgPSBsb29wIDIgYXJyX2luY3Ix CmxldCBhcnJfaW5jcjIgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXIy ID4+PiAoYXJyX3NpbXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVyMyA9IGxvb3AgMyBh cnJfaW5jcjIKbGV0IGFycl9pbmNyMyA9IChhcnJfcGFpcl90b19zaW1wbGUgKCkpID4+PiBhcnJf Y291bnRlcjMgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX2NvdW50ZXI0ID0g bG9vcCA0IGFycl9pbmNyMwpsZXQgYXJyX2luY3I0ID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkg Pj4+IGFycl9jb3VudGVyNCA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291 bnRlcjUgPSBsb29wIDUgYXJyX2luY3I0CmxldCBhcnJfaW5jcjUgPSAoYXJyX3BhaXJfdG9fc2lt cGxlICgpKSA+Pj4gYXJyX2NvdW50ZXI1ID4+PiAoYXJyX3NpbXBsZV90b19wYWlyICgpKQoKbGV0 IGFycl9jb3VudGVyNiA9IGxvb3AgNiBhcnJfaW5jcjUKbGV0IGFycl9pbmNyNiA9IChhcnJfcGFp cl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjYgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIg KCkpCgpsZXQgYXJyX2NvdW50ZXI3ID0gbG9vcCA3IGFycl9pbmNyNgpsZXQgYXJyX2luY3I3ID0g KGFycl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFycl9jb3VudGVyNyA+Pj4gKGFycl9zaW1wbGVf dG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjggPSBsb29wIDggYXJyX2luY3I3CmxldCBhcnJf aW5jcjggPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXI4ID4+PiAoYXJy X3NpbXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVyOSA9IGxvb3AgOSBhcnJfaW5jcjgK bGV0IGFycl9pbmNyOSA9IChhcnJfcGFpcl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjkg Pj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX2NvdW50ZXIxMCA9IGxvb3AgMTAg YXJyX2luY3I5CmxldCBhcnJfaW5jcjEwID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFy cl9jb3VudGVyMTAgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX2NvdW50ZXIx MSA9IGxvb3AgMTEgYXJyX2luY3IxMApsZXQgYXJyX2luY3IxMSA9IChhcnJfcGFpcl90b19zaW1w bGUgKCkpID4+PiBhcnJfY291bnRlcjExID4+PiAoYXJyX3NpbXBsZV90b19wYWlyICgpKQoKbGV0 IGFycl9jb3VudGVyMTIgPSBsb29wIDEyIGFycl9pbmNyMTEKbGV0IGFycl9pbmNyMTIgPSAoYXJy X3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXIxMiA+Pj4gKGFycl9zaW1wbGVfdG9f cGFpciAoKSkKCmxldCBhcnJfbXlfYXJyb3cgKCkgPSAoIGFycl9zaW1wbGVfdG9fcGFpciAoKSAp ID4+PiBhcnJfaW5jcjEyOzsKCmxldCBfID0KICBsZXQgbnRlc3QgPSAgMTAwMDAwIGluCiAgbGV0 IGFycl9teV9hcnJvdyA9IGFycl9teV9hcnJvdyAoKSBpbgogIGxldCBzdGFydF90aW1lID0gVW5p eC5nZXR0aW1lb2ZkYXkgKCkgaW4KICBsZXQgXyA9IHJ1biBhcnJfbXlfYXJyb3cgMiBudGVzdCBp bgogICAgKCk7CiAgICBsZXQgZW5kX3RpbWUgPSBVbml4LmdldHRpbWVvZmRheSAoKSBpbgogICAg bGV0IHRpbWUgPSAoIGVuZF90aW1lIC0uIHN0YXJ0X3RpbWUgKSAvLiAoZmxvYXRfb2ZfaW50IG50 ZXN0KSAqLiAxMDAwMDAwLjAgaW4KICAgICAgUHJpbnRmLnByaW50ZiAiTWVhbiBwcm9jZXNzaW5n IHRpbWUgOiAlZiBtaWNyb3NlY29uZHNcbiIgdGltZTsKICAgICAgCg== ------=_Part_1227_27773700.1197644095452 Content-Type: application/octet-stream; name=measure_pure_cps.ml Content-Transfer-Encoding: base64 X-Attachment-Id: f_fa6u95u1 Content-Disposition: attachment; filename=measure_pure_cps.ml dHlwZSAoJ2EsJ2IpIGFycm93ID0gQXJyb3cgb2YgKCAnYSAtPiAnYiAqICgnYSwnYikgYXJyb3cg KQoKbGV0IHJlYyBhcnIgZiA9IEFycm93ICggZnVuIHggLT4gZiB4ICwgYXJyIGYgKTs7CgpsZXQg cmVjICg+Pj4pIChBcnJvdyBmKSAoQXJyb3cgZykgPQogIEFycm93ICgKICAgIGZ1biB4IC0+CiAg ICAgIGxldCByZixuZiA9IGYgeCBpbiAKICAgICAgbGV0IHJnLG5nID0gZyByZiBpbgoJcmcgLCBu ZiA+Pj4gbmcgCiAgKQo7OwoKbGV0IGxvb3AgaW5pdCBmICA9CiAgbGV0IHJlYyBsb29wX2F1eCBj IChBcnJvdyBmKSA9CiAgICBBcnJvdyAoCiAgICAgIGZ1biB4LT4KCWxldCAoKGMnLCByKSwgbikg PSBmIChjLHgpIGluCgkgIHIgLCBsb29wX2F1eCBjJyBuCiAgICApCiAgaW4KICAgIGxvb3BfYXV4 IGluaXQgZgo7OwoKbGV0IHJlYyBydW4gKEFycm93IGYpIHggPyhpPTApIG1heF9pbmMgPSAKICBp ZiBpID0gbWF4X2luYyB0aGVuCiAgICB4CiAgZWxzZQogICAgbGV0IF8sbiA9IGYgeCBpbgogICAg ICBydW4gbiB4IH5pOihpKzEpIG1heF9pbmMKCgpsZXQgcGFpcl90b19zaW1wbGUgKHgseSkgPSB4 CmxldCBhcnJfcGFpcl90b19zaW1wbGUgKCkgPSBhcnIgcGFpcl90b19zaW1wbGUKCmxldCBzaW1w bGVfdG9fcGFpciB4ID0gKHgseCkKbGV0IGFycl9zaW1wbGVfdG9fcGFpciAoKSA9IGFyciBzaW1w bGVfdG9fcGFpcgoKCmxldCBhcnJfaW5jciA9IGFyciAoIGZ1biAoIGMgLCB4ICkgLT4gYyArIDEg LCBjICsgeCApCgpsZXQgYXJyX2NvdW50ZXIxID0gbG9vcCAxIGFycl9pbmNyCmxldCBhcnJfaW5j cjEgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXIxID4+PiAoYXJyX3Np bXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVyMiA9IGxvb3AgMiBhcnJfaW5jcjEKbGV0 IGFycl9pbmNyMiA9IChhcnJfcGFpcl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjIgPj4+ IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX2NvdW50ZXIzID0gbG9vcCAzIGFycl9p bmNyMgpsZXQgYXJyX2luY3IzID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFycl9jb3Vu dGVyMyA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjQgPSBsb29w IDQgYXJyX2luY3IzCmxldCBhcnJfaW5jcjQgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4g YXJyX2NvdW50ZXI0ID4+PiAoYXJyX3NpbXBsZV90b19wYWlyICgpKQoKbGV0IGFycl9jb3VudGVy NSA9IGxvb3AgNSBhcnJfaW5jcjQKbGV0IGFycl9pbmNyNSA9IChhcnJfcGFpcl90b19zaW1wbGUg KCkpID4+PiBhcnJfY291bnRlcjUgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJy X2NvdW50ZXI2ID0gbG9vcCA2IGFycl9pbmNyNQpsZXQgYXJyX2luY3I2ID0gKGFycl9wYWlyX3Rv X3NpbXBsZSAoKSkgPj4+IGFycl9jb3VudGVyNiA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkK CmxldCBhcnJfY291bnRlcjcgPSBsb29wIDcgYXJyX2luY3I2CmxldCBhcnJfaW5jcjcgPSAoYXJy X3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2NvdW50ZXI3ID4+PiAoYXJyX3NpbXBsZV90b19w YWlyICgpKQoKbGV0IGFycl9jb3VudGVyOCA9IGxvb3AgOCBhcnJfaW5jcjcKbGV0IGFycl9pbmNy OCA9IChhcnJfcGFpcl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjggPj4+IChhcnJfc2lt cGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJyX2NvdW50ZXI5ID0gbG9vcCA5IGFycl9pbmNyOApsZXQg YXJyX2luY3I5ID0gKGFycl9wYWlyX3RvX3NpbXBsZSAoKSkgPj4+IGFycl9jb3VudGVyOSA+Pj4g KGFycl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjEwID0gbG9vcCAxMCBhcnJf aW5jcjkKbGV0IGFycl9pbmNyMTAgPSAoYXJyX3BhaXJfdG9fc2ltcGxlICgpKSA+Pj4gYXJyX2Nv dW50ZXIxMCA+Pj4gKGFycl9zaW1wbGVfdG9fcGFpciAoKSkKCmxldCBhcnJfY291bnRlcjExID0g bG9vcCAxMSBhcnJfaW5jcjEwCmxldCBhcnJfaW5jcjExID0gKGFycl9wYWlyX3RvX3NpbXBsZSAo KSkgPj4+IGFycl9jb3VudGVyMTEgPj4+IChhcnJfc2ltcGxlX3RvX3BhaXIgKCkpCgpsZXQgYXJy X2NvdW50ZXIxMiA9IGxvb3AgMTIgYXJyX2luY3IxMQpsZXQgYXJyX2luY3IxMiA9IChhcnJfcGFp cl90b19zaW1wbGUgKCkpID4+PiBhcnJfY291bnRlcjEyID4+PiAoYXJyX3NpbXBsZV90b19wYWly ICgpKQoKbGV0IGFycl9teV9hcnJvdyAoKSA9ICggYXJyX3NpbXBsZV90b19wYWlyICgpICkgPj4+ IGFycl9pbmNyMTI7OwoKCmxldCBfID0KICBsZXQgbnRlc3QgPSAxMDAwMDAgaW4KICBsZXQgYXJy X215X2Fycm93ID0gYXJyX215X2Fycm93ICgpIGluCiAgbGV0IHN0YXJ0X3RpbWUgPSBVbml4Lmdl dHRpbWVvZmRheSAoKSBpbgogIGxldCBfID0gcnVuIGFycl9teV9hcnJvdyAyIG50ZXN0IGluCiAg ICAoKTsKICAgIGxldCBlbmRfdGltZSA9IFVuaXguZ2V0dGltZW9mZGF5ICgpIGluCiAgICBsZXQg dGltZSA9ICggZW5kX3RpbWUgLS4gc3RhcnRfdGltZSApIC8uIChmbG9hdF9vZl9pbnQgbnRlc3Qp ICouIDEwMDAwMDAuMCBpbgogICAgICBQcmludGYucHJpbnRmICJNZWFuIHByb2Nlc3NpbmcgdGlt ZSA6ICVmIG1pY3Jvc2Vjb25kc1xuIiB0aW1lOwo= ------=_Part_1227_27773700.1197644095452--