Skip to content

Commit 2bb88ec

Browse files
authored
Merge pull request #1031 from bloomberg/minor_tweak
micro optimizations
2 parents 7d92e80 + 9a82231 commit 2bb88ec

16 files changed

+734
-781
lines changed

jscomp/bin/all_ounit_tests.i.ml

Lines changed: 90 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3504,20 +3504,24 @@ let remove (h : _ Hash_set_gen.t) key =
35043504

35053505
let add (h : _ Hash_set_gen.t) key =
35063506
(* 4103 *) let i = key_index h key in
3507-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
3507+
let h_data = h.data in
3508+
let old_bucket = (Array.unsafe_get h_data i) in
3509+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
35083510
begin
3509-
h.data.(i) <- key :: h.data.(i);
3511+
Array.unsafe_set h_data i (key :: old_bucket);
35103512
h.size <- h.size + 1 ;
3511-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h
3513+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h
35123514
end
35133515

35143516
let check_add (h : _ Hash_set_gen.t) key =
35153517
(* 0 *) let i = key_index h key in
3516-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
3518+
let h_data = h.data in
3519+
let old_bucket = (Array.unsafe_get h_data i) in
3520+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
35173521
begin
3518-
h.data.(i) <- key :: h.data.(i);
3522+
Array.unsafe_set h_data i (key :: old_bucket);
35193523
h.size <- h.size + 1 ;
3520-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h;
3524+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h;
35213525
true
35223526
end
35233527
else false
@@ -3526,7 +3530,7 @@ let check_add (h : _ Hash_set_gen.t) key =
35263530
let mem (h : _ Hash_set_gen.t) key =
35273531
(* 3102 *) Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data (key_index h key))
35283532

3529-
# 106
3533+
# 110
35303534
end
35313535

35323536

@@ -3641,20 +3645,24 @@ let remove (h : _ Hash_set_gen.t) key =
36413645

36423646
let add (h : _ Hash_set_gen.t) key =
36433647
(* 15004 *) let i = key_index h key in
3644-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
3648+
let h_data = h.data in
3649+
let old_bucket = (Array.unsafe_get h_data i) in
3650+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
36453651
begin
3646-
h.data.(i) <- key :: h.data.(i);
3652+
Array.unsafe_set h_data i (key :: old_bucket);
36473653
h.size <- h.size + 1 ;
3648-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h
3654+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h
36493655
end
36503656

36513657
let check_add (h : _ Hash_set_gen.t) key =
36523658
(* 0 *) let i = key_index h key in
3653-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
3659+
let h_data = h.data in
3660+
let old_bucket = (Array.unsafe_get h_data i) in
3661+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
36543662
begin
3655-
h.data.(i) <- key :: h.data.(i);
3663+
Array.unsafe_set h_data i (key :: old_bucket);
36563664
h.size <- h.size + 1 ;
3657-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h;
3665+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h;
36583666
true
36593667
end
36603668
else false
@@ -4069,20 +4077,24 @@ let remove (h : _ Hash_set_gen.t) key =
40694077

40704078
let add (h : _ Hash_set_gen.t) key =
40714079
(* 101 *) let i = key_index h key in
4072-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
4080+
let h_data = h.data in
4081+
let old_bucket = (Array.unsafe_get h_data i) in
4082+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
40734083
begin
4074-
h.data.(i) <- key :: h.data.(i);
4084+
Array.unsafe_set h_data i (key :: old_bucket);
40754085
h.size <- h.size + 1 ;
4076-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h
4086+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h
40774087
end
40784088

40794089
let check_add (h : _ Hash_set_gen.t) key =
40804090
(* 8 *) let i = key_index h key in
4081-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
4091+
let h_data = h.data in
4092+
let old_bucket = (Array.unsafe_get h_data i) in
4093+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
40824094
begin
4083-
h.data.(i) <- key :: h.data.(i);
4095+
Array.unsafe_set h_data i (key :: old_bucket);
40844096
h.size <- h.size + 1 ;
4085-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h;
4097+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h;
40864098
true
40874099
end
40884100
else false
@@ -4319,20 +4331,24 @@ let remove (h : _ Hash_set_gen.t) key =
43194331

43204332
let add (h : _ Hash_set_gen.t) key =
43214333
(* 0 *) let i = key_index h key in
4322-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
4334+
let h_data = h.data in
4335+
let old_bucket = (Array.unsafe_get h_data i) in
4336+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
43234337
begin
4324-
h.data.(i) <- key :: h.data.(i);
4338+
Array.unsafe_set h_data i (key :: old_bucket);
43254339
h.size <- h.size + 1 ;
4326-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h
4340+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h
43274341
end
43284342

43294343
let check_add (h : _ Hash_set_gen.t) key =
43304344
(* 0 *) let i = key_index h key in
4331-
if not (Hash_set_gen.small_bucket_mem eq_key key (Array.unsafe_get h.data i)) then
4345+
let h_data = h.data in
4346+
let old_bucket = (Array.unsafe_get h_data i) in
4347+
if not (Hash_set_gen.small_bucket_mem eq_key key old_bucket) then
43324348
begin
4333-
h.data.(i) <- key :: h.data.(i);
4349+
Array.unsafe_set h_data i (key :: old_bucket);
43344350
h.size <- h.size + 1 ;
4335-
if h.size > Array.length h.data lsl 1 then Hash_set_gen.resize key_index h;
4351+
if h.size > Array.length h_data lsl 1 then Hash_set_gen.resize key_index h;
43364352
true
43374353
end
43384354
else false
@@ -4665,10 +4681,10 @@ let stats = Hashtbl_gen.stats
46654681

46664682
let add (h : _ t) key info =
46674683
(* 2000 *) let i = key_index h key in
4668-
let bucket : _ bucketlist = Cons(key, info, h.data.(i)) in
4669-
h.data.(i) <- bucket;
4684+
let h_data = h.data in
4685+
Array.unsafe_set h_data i (Cons(key, info, (Array.unsafe_get h_data i)));
46704686
h.size <- h.size + 1;
4671-
if h.size > Array.length h.data lsl 1 then Hashtbl_gen.resize key_index h
4687+
if h.size > Array.length h_data lsl 1 then Hashtbl_gen.resize key_index h
46724688

46734689
(* after upgrade to 4.04 we should provide an efficient [replace_or_init] *)
46744690
let modify_or_init (h : _ t) key modf default =
@@ -4679,86 +4695,98 @@ let modify_or_init (h : _ t) key modf default =
46794695
else find_bucket next
46804696
| Empty -> (* 0 *) true in
46814697
let i = key_index h key in
4682-
if find_bucket h.data.(i) then
4698+
let h_data = h.data in
4699+
if find_bucket (Array.unsafe_get h_data i) then
46834700
begin
4684-
h.data.(i) <- Cons(key,default (),h.data.(i));
4701+
Array.unsafe_set h_data i (Cons(key,default (), Array.unsafe_get h_data i));
46854702
h.size <- h.size + 1 ;
4686-
if h.size > Array.length h.data lsl 1 then Hashtbl_gen.resize key_index h
4703+
if h.size > Array.length h_data lsl 1 then Hashtbl_gen.resize key_index h
46874704
end
46884705

4706+
4707+
let rec remove_bucket key (h : _ t) (bucketlist : _ bucketlist) : _ bucketlist =
4708+
(* 0 *) match bucketlist with
4709+
| Empty ->
4710+
(* 0 *) Empty
4711+
| Cons(k, i, next) ->
4712+
(* 0 *) if eq_key k key
4713+
then begin h.size <- h.size - 1; next end
4714+
else Cons(k, i, remove_bucket key h next)
4715+
46894716
let remove (h : _ t ) key =
4690-
(* 0 *) let rec remove_bucket (bucketlist : _ bucketlist) : _ bucketlist = (* 0 *) match bucketlist with
4691-
| Empty ->
4692-
(* 0 *) Empty
4693-
| Cons(k, i, next) ->
4694-
(* 0 *) if eq_key k key
4695-
then begin h.size <- h.size - 1; next end
4696-
else Cons(k, i, remove_bucket next) in
4697-
let i = key_index h key in
4698-
h.data.(i) <- remove_bucket h.data.(i)
4717+
(* 0 *) let i = key_index h key in
4718+
let h_data = h.data in
4719+
let old_h_szie = h.size in
4720+
let new_bucket = remove_bucket key h (Array.unsafe_get h_data i) in
4721+
if old_h_szie <> h.size then
4722+
Array.unsafe_set h_data i new_bucket
46994723

47004724
let rec find_rec key (bucketlist : _ bucketlist) = (* 0 *) match bucketlist with
47014725
| Empty ->
4702-
(* 0 *) raise Not_found
4726+
(* 0 *) raise Not_found
47034727
| Cons(k, d, rest) ->
4704-
(* 0 *) if eq_key key k then d else find_rec key rest
4728+
(* 0 *) if eq_key key k then d else find_rec key rest
47054729

47064730
let find_exn (h : _ t) key =
4707-
(* 0 *) match h.data.(key_index h key) with
4731+
(* 0 *) match Array.unsafe_get h.data (key_index h key) with
47084732
| Empty -> (* 0 *) raise Not_found
47094733
| Cons(k1, d1, rest1) ->
4710-
(* 0 *) if eq_key key k1 then d1 else
4734+
(* 0 *) if eq_key key k1 then d1 else
47114735
match rest1 with
47124736
| Empty -> (* 0 *) raise Not_found
47134737
| Cons(k2, d2, rest2) ->
4714-
(* 0 *) if eq_key key k2 then d2 else
4738+
(* 0 *) if eq_key key k2 then d2 else
47154739
match rest2 with
47164740
| Empty -> (* 0 *) raise Not_found
47174741
| Cons(k3, d3, rest3) ->
4718-
(* 0 *) if eq_key key k3 then d3 else find_rec key rest3
4742+
(* 0 *) if eq_key key k3 then d3 else find_rec key rest3
47194743

47204744
let find_opt (h : _ t) key =
47214745
(* 0 *) Hashtbl_gen.small_bucket_opt eq_key key (Array.unsafe_get h.data (key_index h key))
47224746
let find_default (h : _ t) key default =
47234747
(* 0 *) Hashtbl_gen.small_bucket_default eq_key key default (Array.unsafe_get h.data (key_index h key))
47244748
let find_all (h : _ t) key =
47254749
(* 0 *) let rec find_in_bucket (bucketlist : _ bucketlist) = (* 0 *) match bucketlist with
4726-
| Empty ->
4750+
| Empty ->
47274751
(* 0 *) []
4728-
| Cons(k, d, rest) ->
4752+
| Cons(k, d, rest) ->
47294753
(* 0 *) if eq_key k key
47304754
then d :: find_in_bucket rest
47314755
else find_in_bucket rest in
4732-
find_in_bucket h.data.(key_index h key)
4756+
find_in_bucket (Array.unsafe_get h.data (key_index h key))
47334757

47344758
let replace h key info =
47354759
(* 2000 *) let rec replace_bucket (bucketlist : _ bucketlist) : _ bucketlist = (* 4462 *) match bucketlist with
47364760
| Empty ->
4737-
(* 1000 *) raise_notrace Not_found
4761+
(* 1000 *) raise_notrace Not_found
47384762
| Cons(k, i, next) ->
4739-
(* 3462 *) if eq_key k key
4740-
then Cons(key, info, next)
4741-
else Cons(k, i, replace_bucket next) in
4763+
(* 3462 *) if eq_key k key
4764+
then Cons(key, info, next)
4765+
else Cons(k, i, replace_bucket next) in
47424766
let i = key_index h key in
4743-
let l = h.data.(i) in
4767+
let h_data = h.data in
4768+
let l = Array.unsafe_get h_data i in
47444769
try
4745-
h.data.(i) <- replace_bucket l
4770+
Array.unsafe_set h_data i (replace_bucket l)
47464771
with Not_found ->
4747-
h.data.(i) <- Cons(key, info, l);
4748-
h.size <- h.size + 1;
4749-
if h.size > Array.length h.data lsl 1 then Hashtbl_gen.resize key_index h
4772+
begin
4773+
Array.unsafe_set h_data i (Cons(key, info, l));
4774+
h.size <- h.size + 1;
4775+
if h.size > Array.length h_data lsl 1 then Hashtbl_gen.resize key_index h;
4776+
end
47504777

47514778
let mem (h : _ t) key =
47524779
(* 0 *) let rec mem_in_bucket (bucketlist : _ bucketlist) = (* 0 *) match bucketlist with
4753-
| Empty ->
4780+
| Empty ->
47544781
(* 0 *) false
4755-
| Cons(k, d, rest) ->
4782+
| Cons(k, d, rest) ->
47564783
(* 0 *) eq_key k key || mem_in_bucket rest in
4757-
mem_in_bucket h.data.(key_index h key)
4784+
mem_in_bucket (Array.unsafe_get h.data (key_index h key))
47584785

47594786

47604787
let of_list2 ks vs =
4761-
(* 0 *) let map = create 51 in
4788+
(* 0 *) let len = List.length ks in
4789+
let map = create len in
47624790
List.iter2 (fun k v -> (* 0 *) add map k v) ks vs ;
47634791
map
47644792

0 commit comments

Comments
 (0)