- PR -

雑感:第6回 配列ってこんなに便利だったの!?

1
投稿者投稿内容
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 ]
1

スキルアップ/キャリアアップ(JOB@IT)