豊福です。 私 > 良いかどうかはわかりませんが、素朴に思いつくのは。 > Fixnum#<=> の再定義を監視しておいて、 美しくはないですが試しにやってみました。 Solaris2.6 で例の sort の時間がはかったところなぜか こっちの方がほんのちょっと速くなってしまった。不思議??? --- 豊福 toyofuku / juice.or.jp *** array.c.orig Fri Aug 13 14:45:02 1999 --- array.c Fri Nov 5 20:46:41 1999 *************** *** 870,881 **** return NUM2INT(retval); } static VALUE sort_internal(ary) VALUE ary; { qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), ! rb_iterator_p()?sort_1:sort_2); return ary; } --- 870,922 ---- return NUM2INT(retval); } + static int + sort_3(a, b) + VALUE *a, *b; + { + VALUE retval; + + if (TYPE(*a) == T_STRING && TYPE(*b) == T_STRING) { + return rb_str_cmp(*a, *b); + } + + retval = rb_funcall(*a, cmp, 1, *b); + return NUM2INT(retval); + } + + static int + sort_4(a, b) + VALUE *a, *b; + { + VALUE retval; + + if (FIXNUM_P(*a)) { + if (FIXNUM_P(*b)) return *a - *b; + } + + retval = rb_funcall(*a, cmp, 1, *b); + return NUM2INT(retval); + } + + static int + sort_5(a, b) + VALUE *a, *b; + { + VALUE retval; + + retval = rb_funcall(*a, cmp, 1, *b); + return NUM2INT(retval); + } + static VALUE sort_internal(ary) VALUE ary; { + extern int cmp_flag; + static int (*sort_func[])() = {sort_2, sort_3, sort_4, sort_5}; + qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), ! rb_iterator_p()?sort_1:sort_func[cmp_flag]); return ary; } *** eval.c.orig Sat Sep 18 13:48:49 1999 --- eval.c Fri Nov 5 20:47:51 1999 *************** *** 123,128 **** --- 123,139 ---- } } + static ID mid_cmp; + int cmp_flag; + + int + init_cmp_flag() + { + mid_cmp = rb_intern("<=>"); + cmp_flag = 0; + return 0; + } + void rb_add_method(klass, mid, node, noex) VALUE klass; *************** *** 136,141 **** --- 147,158 ---- if (klass == rb_cObject) { rb_secure(4); } + if (mid == mid_cmp) { + if (klass == rb_cFixnum) + cmp_flag |= 1; + else if (klass == rb_cString) + cmp_flag |= 2; + } body = NEW_METHOD(node, noex); st_insert(RCLASS(klass)->m_tbl, mid, body); } *** inits.c.orig Fri Aug 13 14:45:06 1999 --- inits.c Fri Nov 5 20:23:37 1999 *************** *** 77,80 **** --- 77,82 ---- Init_GC(); Init_marshal(); Init_version(); + + init_cmp_flag(); }