From 7ee7f413346d31f978526b1164f00a9f98cae06c Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Mon, 27 Dec 2010 19:33:18 -0800 Subject: [PATCH 1/4] sets: improving the speed of set=. --- core/sets/sets.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sets/sets.factor b/core/sets/sets.factor index ae15908e4c..a73515ca91 100644 --- a/core/sets/sets.factor +++ b/core/sets/sets.factor @@ -61,7 +61,7 @@ M: set subset? sequence/tester all? ; M: set set= - 2dup subset? [ swap subset? ] [ 2drop f ] if ; + 2dup [ cardinality ] bi@ = [ subset? ] [ 2drop f ] if ; M: set fast-set ; From 19a1607804873f47bab0ac9e70b905c49fd481ba Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Wed, 29 Dec 2010 04:53:22 -0800 Subject: [PATCH 2/4] sets: make intersect, intersects?, and subset? faster. --- core/sets/sets-tests.factor | 4 ++++ core/sets/sets.factor | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/sets/sets-tests.factor b/core/sets/sets-tests.factor index e271dc3d22..f78fdb0694 100644 --- a/core/sets/sets-tests.factor +++ b/core/sets/sets-tests.factor @@ -5,10 +5,14 @@ IN: sets.tests [ { } ] [ { } { } intersect ] unit-test [ { 2 3 } ] [ { 1 2 3 } { 2 3 4 } intersect ] unit-test +[ { 2 3 } ] [ { 1 2 3 } { 2 3 4 5 } intersect ] unit-test +[ { 2 3 4 } ] [ { 1 2 3 4 } { 2 3 4 } intersect ] unit-test [ { 2 3 } ] [ { 1 2 2 3 } { 2 3 3 4 } intersect ] unit-test [ { } ] [ { } { } diff ] unit-test [ { 1 } ] [ { 1 2 3 } { 2 3 4 } diff ] unit-test +[ { 1 } ] [ { 1 2 3 } { 2 3 4 5 } diff ] unit-test +[ { 1 } ] [ { 1 2 3 4 } { 2 3 4 } diff ] unit-test [ { 1 } ] [ { 1 1 2 3 } { 2 3 4 4 } diff ] unit-test [ { } ] [ { } { } within ] unit-test diff --git a/core/sets/sets.factor b/core/sets/sets.factor index a73515ca91..904d0d95d7 100644 --- a/core/sets/sets.factor +++ b/core/sets/sets.factor @@ -46,19 +46,22 @@ M: set union : sequence/tester ( set1 set2 -- set1' quot ) [ members ] [ tester ] bi* ; inline +: small/large ( set1 set2 -- set1' set2' ) + 2dup [ cardinality ] bi@ > [ swap ] when ; + PRIVATE> M: set intersect - [ sequence/tester filter ] keep set-like ; + [ small/large sequence/tester filter ] keep set-like ; M: set diff [ sequence/tester [ not ] compose filter ] keep set-like ; M: set intersects? - sequence/tester any? ; + small/large sequence/tester any? ; M: set subset? - sequence/tester all? ; + small/large sequence/tester all? ; M: set set= 2dup [ cardinality ] bi@ = [ subset? ] [ 2drop f ] if ; From a23c8a3711df966b23ae03aa3778e7aaa52fc833 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Mon, 3 Jan 2011 20:36:48 -0800 Subject: [PATCH 3/4] sets: minor optimization. --- core/sets/sets.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sets/sets.factor b/core/sets/sets.factor index 904d0d95d7..06f6e04655 100644 --- a/core/sets/sets.factor +++ b/core/sets/sets.factor @@ -64,7 +64,7 @@ M: set subset? small/large sequence/tester all? ; M: set set= - 2dup [ cardinality ] bi@ = [ subset? ] [ 2drop f ] if ; + 2dup [ cardinality ] bi@ eq? [ subset? ] [ 2drop f ] if ; M: set fast-set ; From 6c2c5c0a82f7be44f8e661a7f4af915d9d3efb0f Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Mon, 3 Jan 2011 20:37:17 -0800 Subject: [PATCH 4/4] assocs: use assoc-size to short-circuit equality checks. --- core/assocs/assocs.factor | 2 +- core/hashtables/hashtables.factor | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/core/assocs/assocs.factor b/core/assocs/assocs.factor index 58a2a29eb1..0508d2e569 100644 --- a/core/assocs/assocs.factor +++ b/core/assocs/assocs.factor @@ -117,7 +117,7 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc ) [ at* [ = ] [ 2drop f ] if ] with-assoc assoc-all? ; : assoc= ( assoc1 assoc2 -- ? ) - [ assoc-subset? ] [ swap assoc-subset? ] 2bi and ; + 2dup [ assoc-size ] bi@ eq? [ assoc-subset? ] [ 2drop f ] if ; : assoc-hashcode ( n assoc -- code ) >alist hashcode* ; diff --git a/core/hashtables/hashtables.factor b/core/hashtables/hashtables.factor index be5aa97634..e7acf12454 100644 --- a/core/hashtables/hashtables.factor +++ b/core/hashtables/hashtables.factor @@ -151,10 +151,7 @@ M: hashtable clone (clone) [ clone ] change-array ; inline M: hashtable equal? - over hashtable? [ - 2dup [ assoc-size ] bi@ eq? - [ assoc= ] [ 2drop f ] if - ] [ 2drop f ] if ; + over hashtable? [ assoc= ] [ 2drop f ] if ; ! Default method M: assoc new-assoc drop ; inline