- 題名: 構造体配列のパフォーマンスについて
- 日時: 2006/11/01 13:56:12
- ID: 18068
- この記事の返信元:
- (なし)
- この記事への返信:
- [18071] Re[1]: 構造体配列のパフォーマンスについて2006/11/01 16:31:03
- ツリーを表示
ありがとうございます。 > 結果の記載が無いようです。 紛らわしい書き方ですいません。この部分が宣言と処理の組み合わせの結果の順位になります。上から速度が速かった順です。 > 1 宣言1-(1) > 2 宣言2-(1) > 3 宣言2-(2) > 4 宣言1-(2) >「構造体を使用する理由」が無いなら、 理由と言いますか、一般的に小さなデータを頻繁に扱う場合はStructureのほうが処理が早いと入門書で読んだ記憶があったためです。 (ボックス化にまで突っ込んだ記載はありませんでした。) > また、配列よりもコレクションを使った方がよいと思います。 これはCollectionBaseを継承した独自のコレクションを定義するということででしょうか? これからそちらの方のサンプルも作ってみます。
お世話になります。下記のように独自のコレクションクラスを作成してテストしてみまし
たが、ArrayList使用時と変わらないようです。なんか.NETは同じ機能を実装するのに色々
な書き方ができるので、混乱ぎみです。すべてオブジェクト指向で書くのが本来なのでしょ
うが、速度等との兼ね合いがあるので、今回は構造体(Structure) + 配列でいきたいと思
います。
Public Class MyCollection
Inherits CollectionBase
Public Shadows Function Add(ByVal Obj As Object) As Object
MyBase.List.Add(Obj)
Return Obj
End Function
Public Shadows Sub Remove(ByVal Obj As Object)
MyBase.List.Remove(Obj)
End Sub
End Class
Private Gakkyu As New MyCollection()
#関係ありませんが、アイコンはこあらを選んでるのですが、これはねずみなような・・?
Hongliangさん、ご丁寧な説明ありがとうございます。 一旦解決済みにしたのですが、説明を読んで参照型と値型でちょっと気になったことがありましたので、外しました。 例えば構造体の定義がClassとStructureでは下記のように書いた場合、動作が違ってきます。 構造体がClassの場合、新しいインスタンスを作成しないと後の代入で値が全て置き換わってしまいます。 Seito.tensu = 50 Gakkyu.Add(Seito) Seito.tensu = 100 Gakkyu.Add(Seito) 参照型なので当たり前と言われればそれまでなのですが、構造体がClassなのかStructureなのか不明なケースや今まで のVB6のType型と同じように使おうとするケースなどないのかと思いまして・・・・ ユーザー定義の構造体をClassで定義する場合、普通どのようにこの辺りをクリアするのが普通でしょうか? (VB6とは考えを変えるとか、直接構造体を触らせないなど) 初歩的なことですいませんが、よろしくお願いします。
分類:[.NET]
こんにちは。 VB6からの移行で比較的単純な構造体を配列で保持するようなコードを作っているのですが、 件数的には1万件ほどでテストした結果、速度的に以下のような結果になりました。 (コードはより簡単にしたサンプルです) ボックス化とかが影響している?かとか詳細なことはわかりませんが、一般的にはどのよう に作成するのがもっとも効率がよい方法でしょうか? 構造体のメンバーがこういうケースならとかケースによる場合などもあればご教示頂けると 有難いです。よろしくお願いします。 1 宣言1-(1) 2 宣言2-(1) 3 宣言2-(2) 4 宣言1-(2) 宣言1 Private Structure Seito Public Simei As String Public tensu As Integer End Structure 宣言2 Private Class Seito Public Simei As String Public tensu As Integer End Class (1) Private Gakkyu As Seito() ReDim Preserve Gakkyu(0) Gakkyu(0) = New Seito() Gakkyu(0).Simei = "ビル ゲイ太" Gakkyu(0).tensu = 50 (2) Private Gakkyu As New ArrayList() Dim iSeito As Seito = New Seito() iSeito.Simei = "ビル ゲイ太" iSeito.tensu = 50 Gakkyu.Add(iSeito)