豊福です。

私
> Fixnum と String の
> 比較は組み込みなので <=> を定義し直しても効かないの
> ですね。
> 
>     x = [3,1,4,2]
>     p 1<=>2
>     p x.sort
>     class Fixnum
>       alias cmp <=>
>       def <=>(b)
>         b.cmp self # 逆にした
>       end
>     end
>     p 1<=>2
>     p x.sort
> 
> 結果
>     -1
>     [1, 2, 3, 4]
>     1
>     [1, 2, 3, 4]

  反応がないので不安ですが、これ仕様ではないですよね。
修正は array.c sort_2() の

    if (FIXNUM_P(*a)) {
	if (FIXNUM_P(*b)) return *a - *b;
    }
    else if (TYPE(*a) == T_STRING) {
	if (TYPE(*b) == T_STRING) return str_cmp(*a, *b);
    }

の部分を外すしかないでしょうか。

  これを外して例の

    s = (1..20000).collect{|i|i} + ("a".."zzz").collect{|i|i}
    foo = []
    1.upto(20000) do
      foo.push s[rand(38277)]
    end
    bar = foo.dup
    bar.filter{|i| [i.to_i, i.to_s, i] }.sort!.filter{|i| i.pop }

を試したところ約2倍かかるようになりました。
---
                        豊福
                        toyofuku / juice.or.jp