[macruby-changes] [2237] MacRuby/trunk/array.c

source_changes at macosforge.org source_changes at macosforge.org
Wed Aug 5 20:50:45 PDT 2009


Revision: 2237
          http://trac.macosforge.org/projects/ruby/changeset/2237
Author:   lsansonetti at apple.com
Date:     2009-08-05 20:50:44 -0700 (Wed, 05 Aug 2009)
Log Message:
-----------
minor optimization: let's preset the capacity of arrays in some areas to avoid memory allocation later

Modified Paths:
--------------
    MacRuby/trunk/array.c

Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c	2009-08-05 23:17:55 UTC (rev 2236)
+++ MacRuby/trunk/array.c	2009-08-06 03:50:44 UTC (rev 2237)
@@ -56,6 +56,14 @@
 }
 #define rb_ary_modify rb_ary_modify_check
 
+extern void _CFArraySetCapacity(CFMutableArrayRef array, CFIndex cap);
+
+static inline void
+rb_ary_set_capacity(VALUE ary, long len)
+{
+    _CFArraySetCapacity((CFMutableArrayRef)ary, len);
+}
+
 VALUE
 rb_ary_freeze(VALUE ary)
 {
@@ -297,6 +305,7 @@
     if (len > LONG_MAX / sizeof(VALUE)) {
 	rb_raise(rb_eArgError, "array size too big");
     }
+    rb_ary_set_capacity(ary, len);
     if (rb_block_given_p()) {
 	long i;
 
@@ -1657,6 +1666,7 @@
 
     RETURN_ENUMERATOR(ary, 0, 0);
     collect = rb_ary_new();
+    rb_ary_set_capacity(collect, RARRAY_LEN(ary));
     for (i = 0; i < RARRAY_LEN(ary); i++) {
 	VALUE v = rb_yield(RARRAY_AT(ary, i));
 	RETURN_IF_BROKEN();
@@ -2287,10 +2297,12 @@
 
     y = to_ary(y);
     z = rb_ary_new2(0);
-    CFArrayAppendArray((CFMutableArrayRef)z, 
-	(CFArrayRef)x, CFRangeMake(0, RARRAY_LEN(x)));    
-    CFArrayAppendArray((CFMutableArrayRef)z, 
-	(CFArrayRef)y, CFRangeMake(0, RARRAY_LEN(y)));    
+    const size_t x_len = RARRAY_LEN(x);
+    const size_t y_len = RARRAY_LEN(y);
+    rb_ary_set_capacity(z, x_len + y_len);
+    CFArrayAppendArray((CFMutableArrayRef)z, (CFArrayRef)x, CFRangeMake(0, x_len));    
+    CFArrayAppendArray((CFMutableArrayRef)z, (CFArrayRef)y, CFRangeMake(0, y_len));    
+
     return z;
 }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090805/205812d4/attachment.html>


More information about the macruby-changes mailing list