- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2007-02-08 21:49
3ページ目にある、IComparer インターフェイスを実装したコードですが。
例示されているコードだと、最低2回、最大4回、型変換を実行しなければなりません。
コード: |
|
Public Function Compare(ByVal x As Object, ByVal y As Object) ...
If CSng(x) < CSng(y) Then ここで2回
Return 1 ' x < yのときは1を返す
ElseIf CSng(x) > CSng(y) Then ここで2回
Return -1 ' x > yのときは-1を返す
Else
Return 0 ' x = yのときは0を返す
End If
End Function
|
しかし、次のようにすると、必ず2回の型変換で済みます。型変換のコストは大きいので、これだけでもかなりのパフォーマンス改善が見込めると思います。
コード: |
|
Public Function Compare(ByVal x As Object, ByVal y As Object) ...
Dim sx As Single = CSng(x)
Dim sy As Single = CSng(y)
If sx < sy Then
Return 1 ' x < yのときは1を返す
ElseIf sx > sy Then
Return -1 ' x > yのときは-1を返す
Else
Return 0 ' x = yのときは0を返す
End If
End Function
|
さらに、If 文もコストの高い処理ですから、次のようにすることで、If 文をなくせます。
コード: |
|
Public Function Compare(ByVal x As Object, ByVal y As Object) ...
Dim sx As Single = CSng(x)
Dim sy As Single = CSng(y)
Return sy - sx
End Function
|
それより何より、ソートする対象の型が決まっているので、IComparer ジェネリック インターフェイスを使えば、型変換のコストもなくなるのではないでしょうか。
(他の回でやる予定だったならゴメンなさい)
_________________
|
- なちゃ
- ぬし
- 会議室デビュー日: 2003/06/11
- 投稿数: 872
|
投稿日時: 2007-02-09 01:06
細かく検証してないですが、ジェネリックインターフェイスを使用すれば、
配列でソート→逆順の、まあ半分弱程度の速度にはなりますね。
あとは時間計測するなら、せっかく用意されてるんだからStopWatch使ってほしい。
あんな変わったやり方でシャッフルするなら、シャッフルを行う場合の定石的なやり方にも触れてほしい。
|
- なちゃ
- ぬし
- 会議室デビュー日: 2003/06/11
- 投稿数: 872
|
投稿日時: 2007-02-09 01:14
引用: |
|
Jittaさんの書き込み (2007-02-08 21:49) より:
さらに、If 文もコストの高い処理ですから、次のようにすることで、If 文をなくせます。
コード: |
|
Public Function Compare(ByVal x As Object, ByVal y As Object) ...
Dim sx As Single = CSng(x)
Dim sy As Single = CSng(y)
Return sy - sx
End Function
|
|
いやSingleのまま返そうとしたらまずいんじゃ…
Return sy.ComapreTo(sx)
とかではどうでしょう(単にめんどくさがりなだけですが)
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2007-02-09 12:11
引用: |
|
なちゃさんの書き込み (2007-02-09 01:14) より:
引用: |
|
Jittaさんの書き込み (2007-02-08 21:49) より:
さらに、If 文もコストの高い処理ですから、次のようにすることで、If 文をなくせます。
コード: |
|
Public Function Compare(ByVal x As Object, ByVal y As Object) ...
Dim sx As Single = CSng(x)
Dim sy As Single = CSng(y)
Return sy - sx
End Function
|
|
いやSingleのまま返そうとしたらまずいんじゃ…
Return sy.ComapreTo(sx)
とかではどうでしょう(単にめんどくさがりなだけですが)
|
確かにm(_ _ )m
Math.Sign とか考えていたのですが、なぜSingle?ってところで面倒になった(^_^;)
追記:検索結果だけ見て、誤解していた(ノ_-;)
なお、IComparerを使ったものがあまりにも遅いのは、オブジェクトの作成や利用の問題じゃないですよね?それはDataGridviewの話ですよね?
という意図がありました。
[ メッセージ編集済み 編集者: Jitta 編集日時 2007-02-09 12:16 ]
|