File 1901-Optimize-when-comparing-maps.patch of Package erlang

From b20593b3dff4fa1017110c160d6a28ebca6a295f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Fri, 7 Feb 2020 11:43:40 +0100
Subject: [PATCH] Optimize =:= when comparing maps

Teach `=:=` to immediately return `false` when comparing two maps
of different sizes. That can be much faster for huge maps.

Reported in the elixir forum:

https://elixirforum.com/t/erlang-2-does-not-seem-to-check-map-sizes-before-performing-the-thoroughful-comparison/28910
---
 erts/emulator/beam/utils.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c
index d6e069f756..2f7c8dfb5e 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -2973,10 +2973,14 @@ tailrecur_ne:
 		    bb = hashmap_val(b) + 1;
 		    switch (hdr & _HEADER_MAP_SUBTAG_MASK) {
 		    case HAMT_SUBTAG_HEAD_ARRAY:
+                        if (aa[0] != bb[0])
+                            goto not_equal;
 			aa++; bb++;
 			sz = 16;
 			break;
 		    case HAMT_SUBTAG_HEAD_BITMAP:
+                        if (aa[0] != bb[0])
+                            goto not_equal;
 			aa++; bb++;
 		    case HAMT_SUBTAG_NODE_BITMAP:
 			sz = hashmap_bitcount(MAP_HEADER_VAL(hdr));
-- 
2.16.4

openSUSE Build Service is sponsored by