[macruby-changes] [2294] MacRuby/trunk/array.c
source_changes at macosforge.org
source_changes at macosforge.org
Tue Aug 11 22:55:36 PDT 2009
Revision: 2294
http://trac.macosforge.org/projects/ruby/changeset/2294
Author: lsansonetti at apple.com
Date: 2009-08-11 22:55:36 -0700 (Tue, 11 Aug 2009)
Log Message:
-----------
more minor Array optimizations
Modified Paths:
--------------
MacRuby/trunk/array.c
Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c 2009-08-12 02:29:56 UTC (rev 2293)
+++ MacRuby/trunk/array.c 2009-08-12 05:55:36 UTC (rev 2294)
@@ -206,15 +206,27 @@
ary->len = 0;
}
+static VALUE
+rb_equal_fast(VALUE x, VALUE y)
+{
+ if (x == y) {
+ return Qtrue;
+ }
+ if (SPECIAL_CONST_P(x) && SPECIAL_CONST_P(y) && TYPE(x) == TYPE(y)) {
+ return Qfalse;
+ }
+ return rb_equal(x, y);
+}
+
#define NOT_FOUND LONG_MAX
-size_t
+static size_t
rary_index_of_item(rb_ary_t *ary, size_t origin, VALUE item)
{
assert(origin < ary->len);
for (size_t i = origin; i < ary->len; i++) {
VALUE item2 = rary_elt(ary, i);
- if (item == item2 || rb_equal(item, item2) == Qtrue) {
+ if (rb_equal_fast(item, item2) == Qtrue) {
return i;
}
}
@@ -1887,6 +1899,27 @@
VALUE a = *(VALUE *)ap;
VALUE b = *(VALUE *)bp;
+ if (FIXNUM_P(a) && FIXNUM_P(b)) {
+ if ((long)a > (long)b) {
+ return 1;
+ }
+ if ((long)a < (long)b) {
+ return -1;
+ }
+ return 0;
+ }
+ else if (FIXFLOAT_P(a) && FIXFLOAT_P(b)) {
+ const double fa = FIXFLOAT2DBL(a);
+ const double fb = FIXFLOAT2DBL(b);
+ if (fa > fb) {
+ return 1;
+ }
+ if (fa < fb) {
+ return -1;
+ }
+ return 0;
+ }
+
/* FIXME optimize!!! */
if (TYPE(a) == T_STRING) {
if (TYPE(b) == T_STRING) {
@@ -2883,7 +2916,8 @@
|| FIXFLOAT_P(item2) && isnan(FIXFLOAT2DBL(item2))) {
return Qfalse;
}
- if (item1 != item2 && rb_equal(item1, item2) == Qfalse) {
+
+ if (rb_equal_fast(item1, item2) == Qfalse) {
return Qfalse;
}
}
@@ -3068,15 +3102,37 @@
static VALUE
rb_ary_diff(VALUE ary1, SEL sel, VALUE ary2)
{
- VALUE hash = ary_make_hash(to_ary(ary2), 0);
+ ary2 = to_ary(ary2);
+ const long ary1_len = RARRAY_LEN(ary1);
+ const long ary2_len = RARRAY_LEN(ary2);
+
VALUE ary3 = rb_ary_new();
- for (long i = 0; i < RARRAY_LEN(ary1); i++) {
- VALUE v = RARRAY_AT(ary1, i);
- if (rb_hash_has_key(hash, v) == Qfalse) {
- rb_ary_push(ary3, rb_ary_elt(ary1, i));
+ if (ary2_len == 0) {
+ rb_ary_concat(ary3, ary1);
+ return ary3;
+ }
+
+ rary_reserve(RARY(ary3), ary1_len);
+
+ if (ary1_len < 100 && ary2_len < 100 && IS_RARY(ary1) && IS_RARY(ary2)) {
+ for (long i = 0; i < ary1_len; i++) {
+ VALUE elem = rary_elt(RARY(ary1), i);
+ if (rary_index_of_item(RARY(ary2), 0, elem) == NOT_FOUND) {
+ rary_append(RARY(ary3), elem);
+ }
}
}
+ else {
+ VALUE hash = ary_make_hash(ary2, 0);
+
+ for (long i = 0; i < ary1_len; i++) {
+ VALUE v = RARRAY_AT(ary1, i);
+ if (rb_hash_has_key(hash, v) == Qfalse) {
+ rb_ary_push(ary3, rb_ary_elt(ary1, i));
+ }
+ }
+ }
return ary3;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090811/2e10e1e2/attachment-0001.html>
More information about the macruby-changes
mailing list