[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