Skip to content

Commit

Permalink
Optimize the rary_splice().
Browse files Browse the repository at this point in the history
* before
               user     system      total        real
len == rlen  0.860000   0.000000   0.860000 (  0.852845)
len != rlen 21.180000   0.010000  21.190000 ( 21.186979)

* after
                user     system      total        real
len == rlen  0.050000   0.000000   0.050000 (  0.056620)
len != rlen  0.150000   0.000000   0.150000 (  0.145373)

{{{
require 'benchmark'

Benchmark.bm(10) do |x|
  ary =  Array.new(1000)
  tmp =  ["a"] * 1100
  x.report "len ==  rlen" do
    10000.times do
      ary[100, tmp.size] =  tmp
    end
  end

  x.report "len !=  rlen" do
    10000.times do
      ary[100, tmp.size - 1] =  tmp
    end
  end
end
}}}
  • Loading branch information
Watson1978 committed Jun 19, 2011
1 parent c890444 commit 8b4d3bd
Showing 1 changed file with 28 additions and 6 deletions.
34 changes: 28 additions & 6 deletions array.c
Expand Up @@ -942,14 +942,36 @@ rary_splice(VALUE ary, long beg, long len, VALUE rpl)
}
}
else if (len == rlen) {
for (long i = 0; i < len; i++) {
rary_elt_set(ary, beg + i, rb_ary_elt(rpl, i));
}
if (rlen > 0 && IS_RARY(rpl)) {
GC_MEMMOVE(&RARY(ary)->elements[RARY(ary)->beg + beg],
&RARY(rpl)->elements[RARY(rpl)->beg],
sizeof(VALUE) * len);
}
else {
for (long i = 0; i < len; i++) {
rary_elt_set(ary, beg + i, rb_ary_elt(rpl, i));
}
}
}
else {
rary_erase(ary, beg, len);
for (long i = 0; i < rlen; i++) {
rary_insert(ary, beg + i, rb_ary_elt(rpl, i));
if (rlen > 0 && IS_RARY(rpl)) {
long newlen = RARY(ary)->len + rlen - len;

rary_reserve(ary, newlen);
GC_MEMMOVE(&RARY(ary)->elements[RARY(ary)->beg + beg + rlen],
&RARY(ary)->elements[RARY(ary)->beg + beg + len],
sizeof(VALUE) * (RARY(ary)->len - (beg + len)));

GC_MEMMOVE(&RARY(ary)->elements[RARY(ary)->beg + beg],
rary_ptr(rpl),
sizeof(VALUE) * rlen);
RARY(ary)->len = newlen;
}
else {
rary_erase(ary, beg, len);
for (long i = 0; i < rlen; i++) {
rary_insert(ary, beg + i, rb_ary_elt(rpl, i));
}
}
}
}
Expand Down

0 comments on commit 8b4d3bd

Please sign in to comment.