09/02/13 03:07:49
こんだけ単純なコードなら吐き出したCIL見比べた方が早いんじゃない?
838:デフォルトの名無しさん
09/02/13 03:30:55
ところがぎっちょん。
cscでコンパイルしたのをmonoで動かしても
gmcsでコンパイルしたのをmsclrで動かしても同じ結果なのです。
839:デフォルトの名無しさん
09/02/13 04:59:31
// fsc -O test9f.fs / fscp -O test9f.fs
#light
open System.Diagnostics
let rec reverse cnt ar =
if cnt > 0 then (Array.rev ar |> reverse (cnt - 1)) else ar
let Run ar =
let sw = Stopwatch.StartNew() in
let rt = reverse 100 ar in
sw.Stop(); printfn "%A" sw.Elapsed; rt
let _ =
printfn "%A" (Run [| 0..10000 |]);
printfn "%A" (Run [| 0L..10000L |]);;
840:デフォルトの名無しさん
09/02/13 05:00:39
F# (on mono 2.2)でやってみると
配列をコピーするのでその分時間がかかっているが、int64は結構速い。
00:00:00.0112015 (int32
00:00:00.0134897 (int64
>>819 の結果はこれ
System.Int32: 00:00:00.0050849 s
System.Int64: 00:00:01.3990044 s
841:819
09/02/13 13:27:13
>>837
ILは知識が無くてわからないけど、
>>838の言うような結果になった。
gmcsでコンパイルしてmonoで実行=cscでコンパイルしてmonoで実行
gmcsでコンパイルしてmsclrで実行=cscでコンパイルしてmsclrで実行
ね。
842:デフォルトの名無しさん
09/02/13 17:05:23
つまり Array.Reverse の中の人の差か
843:822
09/02/14 23:18:34
>>842が原因を解明してくれたんで、チラッと調べてみた。
ソースは mono-2.2/mcs/class/corlib/System/Array.cs で、
詳細は省くけど object int double 以外は、汎用的なやたら遅い
Swapper というもので処理されてた。
当然 long が Swapper で処理されていたので、int と同じ処理
を追加したら以下の結果になった。
System.Int32: 0.0042768 s
System.Int64: 0.0050798 s
System.Int32: 0.0042583 s
System.Int64: 0.0051871 s
System.Int32: 0.0043195 s
System.Int64: 0.0052207 s
ソース見ればなんで遅いかは一目瞭然だけど、こういう処理は
Generic を使うべきだろうなと痛感する。(List.Reverse か?)
844:822
09/02/14 23:40:01
以下パッチ
*** Array.cs.orig 2008-11-11 14:02:14.000000000 +0900
--- Array.cs 2009-02-14 22:40:01.000000000 +0900
***************
*** 1215,1220 ****
--- 1215,1231 ----
}
return;
}
+ long[] larray = array as long[];
+ if (larray != null) {
+ while (index < end) {
+ long tmp = larray [index];
+ larray [index] = larray [end];
+ larray [end] = tmp;
+ ++index;
+ --end;
+ }
+ return;
+ }
double[] darray = array as double[];
if (darray != null) {
while (index < end) {
845:822
09/02/15 00:44:07
同じexeをVistaで実行したら
System.Int32: 0.0007259 s
System.Int64: 0.0025201 s
だった・・・
速度差はJITコンパイラ自体の速度差のような気がする。
JITコンパイラは、早いコードを生成する最適化も必要だけど
自分自身も高速に動かないといけないジレンマがあるよな。
846:デフォルトの名無しさん
09/02/15 01:05:25
どうでもいいコード書くときはリストより配列の方が書くのめんどくさくなくて使ったもののあっれーおっそいなーとかってよくあるよねー俺だけですかーそうですよねー
847:デフォルトの名無しさん
09/02/15 03:02:52
>>843-845
面白いネタだ
サンクス
848:デフォルトの名無しさん
09/02/15 10:16:53
今後のために言っておくと、パッチの中身を2chにそのまま貼るのはやめたほうがいい
書き込むときの2chの同意画面に注意
849:819
09/02/15 23:57:39
>>843
自分でもArray.csを読んでみた。
なるほど、その3つの型以外では
for(int l=0,r=array.Length;l<r;l++,r--){
object temp=array.GetValue(l);
array.SetValue(array.GetValue(r),l);
array.SetValue(temp,r);
}
みたいな実装になってるのか。そりゃ遅い訳だ
2.0以降はArray.Sort<T>(T[] array)があるみたいだから、
ついでにReverse<T>(T[] array)とかも追加されてたら良かったのにね
850:819
09/02/16 00:00:08
すまん、どうでもいいかもしれんが
×for(int l=0,r=array.Length;l<r;l++,r--)
○for(int l=0,r=array.Length-1;l<r;l++,r--)
ね。
851:デフォルトの名無しさん
09/02/18 22:22:12
クラスライブラリ(dll)読み込まんのだけどなんでだろ。
ほかのサーバーでは同じディレクトリに入れとけばNPだったのに。
なんか必要なことあるんでしょうか?
852:デフォルトの名無しさん
09/02/23 00:19:56
なんかMONO足りないな・・・
853:デフォルトの名無しさん
09/02/27 01:55:53
2.4RC1が出たぞ。
* JIT
o Metadata verifier
* ASP.NET
o 3.5 APIs (except for Linq support)
o Precompiled Web Sites.
* MonoDevelop 2.0
o Built-in GUI debugger
てなってるが、バグフィックスリリースなんで面白みはない。
854:アカツキ特戦隊
09/03/02 10:23:06
僕も頑張って、よい消しゴム作ったつもりです。
オークションで流してみたので、見ていってください^-^
URLリンク(page2.auctions.yahoo.co.jp)
855:デフォルトの名無しさん
09/03/13 02:50:13
コンカレントGCは実装されないのかー?
856:デフォルトの名無しさん
09/03/25 08:06:13
URLリンク(blog.browncat.org)
わかるような気もする…
857:デフォルトの名無しさん
09/03/25 09:48:45
MONO消し
ププッ・・・ククククッw