[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 06/08 14:41 / Filesize : 240 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

VB.NET質問スレ (Part10)



261 名前:デフォルトの名無しさん mailto:sage [05/03/13 00:40:04 ]
>>259
面白そうなのでちょっとILDASMで見てみた。

(2)の最大のボトルネックはCountプロパティの取得部分であるのは動作を見れば一目瞭然。
では内部でどんな作業をしてるのかというと、
1.オーナーであるListViewのCheckedIndicesを取得して、そのCountプロパティを返す。
2.CheckedIndices.Countは、内部ではオーナーであるListViewのItemsプロパティを取得し、
 それをFor Eachで回して一つ一つCheckedプロパティを確認し、インクリメントして計測する。
という遠大な事をやっている。
For ... To で毎回Countプロパティを取得してればそりゃ死ねる。
Forの前に一度Countを別変数に取り出すだけで劇的に改善され、(3)にほぼ並ぶ。

さて、(2)と(3)の違いだが。
(2)は毎回Item(Integer)を呼んでいる。この動作の遷移は、
1.ListViewのCheckedIndicesを取得、CheckedIndices.Itemを呼ぶ
2.CheckedIndices.Itemは内部でListView.ItemsをForで回し、Index回目で見つかったCheckedのインデックスを返す
3.返されたインデックスのアイテムをListView.Itemsから取得し、それを返す
という流れだ。分かりにくいなんて意見はスルー。

(3)、For Eachは内部でGetEnumeratorが呼ばれ、それで返されるIEnumeratorのCurrentプロパティ・MoveNextメソッドで列挙動作が行われる。
ではGetEnumeratorはどうなってるかというと、
1.CheckedListViewItemCollection.Countを取得し、その数でListViewItem配列を作成する
2.ListViewのItemsをForで回し、Checkedかどうか確かめてCheckedなアイテムを順に配列に格納する
3.配列のGetEnumeratorを返す
って流れになる。
配列のGetEnumeratorは、MoveNextが呼ばれるごとにインデックスをインクリメントして、Currentで現在のインデックスのアイテムを返すってだけの簡単な処理。

(3)はCheckedListViewItemCollection.Countを取得してる以外にコストがかかる処理はなさそうだ。それが大きいけど。
(2)は2.の所だな。指すインデックスが後ろになればなるほどコストがかかるようになる。
その上ch.Item(ii)がループ回数呼ばれてる訳で、その回数分のListView.Itemsのループが発生してしまうと。

こんな動作を知ってしまった後では、でかいビューでCheckedItemsを使うのは躊躇しちゃうね。






[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<240KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef