From 694328b837aa17ac8cfbaf576d338121b5c1cb26 Mon Sep 17 00:00:00 2001 From: Hongbo Zhang Date: Thu, 18 Jan 2018 14:51:16 +0800 Subject: [PATCH] add an example bench using bindings --- jscomp/test/.depend | 2 + jscomp/test/Makefile | 2 + jscomp/test/imm_map_bench.js | 90 +++++++++++++++++++++++++++++------- jscomp/test/imm_map_bench.ml | 43 +++++++++++++++++ 4 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 jscomp/test/imm_map_bench.ml diff --git a/jscomp/test/.depend b/jscomp/test/.depend index ef3c0219dbf..b1a38e0ef30 100644 --- a/jscomp/test/.depend +++ b/jscomp/test/.depend @@ -326,6 +326,8 @@ hashtbl_test.cmj : mt.cmj ../stdlib/moreLabels.cmj ../stdlib/list.cmj \ hello.foo.cmj : ../runtime/js.cmj http_types.cmj : ../runtime/js.cmj ignore_test.cmj : mt.cmj ../runtime/js.cmj +imm_map_bench.cmj : ../runtime/js.cmj ../others/bs_Array.cmj \ + ../others/bs.cmj include_side_effect.cmj : side_effect.cmj include_side_effect_free.cmj : side_effect_free.cmj infer_type_test.cmj : ../runtime/js.cmj infer_type_test.cmi diff --git a/jscomp/test/Makefile b/jscomp/test/Makefile index cd7feea1070..2827f4360e5 100644 --- a/jscomp/test/Makefile +++ b/jscomp/test/Makefile @@ -236,6 +236,8 @@ OTHERS := test_literals a test_ari test_export2 test_internalOO test_obj_simple_ bs_stack_test\ bs_poly_map_test\ bs_poly_mutable_map_test\ + imm_map_bench\ + # bs_uncurry_test # needs Lam to get rid of Uncurry arity first # simple_derive_test diff --git a/jscomp/test/imm_map_bench.js b/jscomp/test/imm_map_bench.js index f673af51923..27c09494390 100644 --- a/jscomp/test/imm_map_bench.js +++ b/jscomp/test/imm_map_bench.js @@ -1,25 +1,81 @@ 'use strict'; -var Immutable = require('immutable'); -var Map = Immutable.OrderedMap -var m = new Map(); -function should(b){ - if (!b){ - throw new Error("impossible") - } +var Bs_Array = require("../../lib/js/bs_Array.js"); +var Bs_MapInt = require("../../lib/js/bs_MapInt.js"); +var Immutable = require("immutable"); + +var empty = new Immutable.OrderedMap(); + +function ofArray(kvs) { + var v = empty; + for(var i = 0 ,i_finish = kvs.length - 1 | 0; i <= i_finish; ++i){ + var match = kvs[i]; + v = v.set(match[0], match[1]); + } + return v; } -function test() { - var count = 1000000; - for(var i = 0; i < count; ++i) { - m = m.set(i, i); + +function should(b) { + if (b) { + return 0; + } else { + throw new Error("impossible"); } - for(var j = 0; j < count; ++j) { - should(m.get(j) !== undefined); +} + +var shuffledDataAdd = Bs_Array.shuffle(Bs_Array.init(1000001, (function (i) { + return /* tuple */[ + i, + i + ]; + }))); + +var shuffleRemoved = Bs_Array.shuffle(Bs_Array.init(2000001, (function (i) { + return i; + }))); + +function test() { + var v = ofArray(shuffledDataAdd); + for(var j = 0; j <= 1000000; ++j){ + should(+v.has(j)); } - for (var j = 0; j < count; ++j){ - m = m.delete(j) + return /* () */0; +} + +function test2() { + var v = Bs_MapInt.ofArray(shuffledDataAdd); + for(var j = 0; j <= 1000000; ++j){ + should(Bs_MapInt.mem(v, j)); } - should(m.size === 0) + return /* () */0; } -test(); \ No newline at end of file +console.time("imm_map_bench.ml 42"); + +test(/* () */0); + +console.timeEnd("imm_map_bench.ml 42"); + +console.time("imm_map_bench.ml 43"); + +test2(/* () */0); + +console.timeEnd("imm_map_bench.ml 43"); + +var A = 0; + +var count = 1000000; + +var M = 0; + +exports.A = A; +exports.empty = empty; +exports.ofArray = ofArray; +exports.should = should; +exports.count = count; +exports.shuffledDataAdd = shuffledDataAdd; +exports.shuffleRemoved = shuffleRemoved; +exports.test = test; +exports.M = M; +exports.test2 = test2; +/* empty Not a pure module */ diff --git a/jscomp/test/imm_map_bench.ml b/jscomp/test/imm_map_bench.ml new file mode 100644 index 00000000000..0f1e3cc88f1 --- /dev/null +++ b/jscomp/test/imm_map_bench.ml @@ -0,0 +1,43 @@ + +type map +external empty : unit -> map = "OrderedMap" [@@bs.new] [@@bs.module "immutable"] +external set : map -> int -> int -> map = "set" [@@bs.send] +external get : map -> int -> int option = "get" [@@bs.send] [@@bs.return undefined_to_opt] +external mem : map -> int -> bool = "has" [@@bs.send] + + +module A = Bs_Array +let empty = empty () +let ofArray kvs = + let v = ref empty in + for i = 0 to A.length kvs - 1 do + let key, value = (A.unsafe_get kvs i) in + v := set !v key value + done; + !v + +let should b = + if not b then Js.Exn.raiseError "impossible" +let count = 1_000_000 +let shuffledDataAdd = (A.shuffle (A.init (count + 1) (fun[@bs] i -> (i,i)))) +let shuffleRemoved = A.shuffle (A.init (2 * count + 1) (fun [@bs] i -> i )) + + +let test () = + let v = ofArray shuffledDataAdd in + for j = 0 to count do + should (mem v j) + done + +module M = Bs.MapInt + + +let test2 () = + let v = M.ofArray shuffledDataAdd in + for j = 0 to count do + should (M.mem v j) + done ; + + +;; [%time test ()] +;; [%time test2 ()]