- ふらっと C#,C♯,C#(初心者用) Part117 [転載禁止]©2ch.net
826 :デフォルトの名無しさん[sage]:2015/11/15(日) 16:38:51.59 ID:kqjPbh/t - SQLをシンプルにして、LINQでごにょごにょする。
かなり綺麗になる。でも、巨大なデータをメモリ上に置くことになるので これが最適かどうかはわからない。 どうしたらいいんだろう…。
| - ふらっと C#,C♯,C#(初心者用) Part117 [転載禁止]©2ch.net
828 :デフォルトの名無しさん[sage]:2015/11/15(日) 17:06:33.10 ID:kqjPbh/t - ユーザー情報がID、名前、年齢、パスワード、メールアドレスで管理されているとする。
IDが4バイト、名前が255バイト、年齢1バイト、パスワード255バイト、メールアドレス255バイト だとすると、1レコードで770バイト。1万人を管理するとして、7,700,000バイトつまり7MB。 メモリ数が4GBだとすると、1/600くらいをメモリが占めることになる。思ったより巨大。 例えば年齢が25歳以下のユーザーだけを取り出したいとする。 そのために、.Where(u => u.age <= 25) というLINQ式を追加する。 7MBのデータを一つずつ見ていかなければならないとすると、一つのメソッドでどれくらいの時間がかかるだろうか? 完全に適当だが、1レコードで100万分の1秒くらいと予想。 1万人で0.01秒。つまりメソッド一つで0.01秒しかかからない。 メモリもすぐに解放される。1/600と聞くと意外と大きな割合のように思えるが、存在しているのはほんの0.01秒である。 さて、メソッドが連なっている場合はどうなるか。 一つ目のメソッドでWbereメソッドを使っているとすると、二つ目以降のメソッドでは、処理対象のレコードが少なくなる。 それは例えば1万→5000といったように。 すると当然、処理時間も減少する。上の例では0.005秒と半分になる。 対象レコード数が1万程度なら何も問題はなさそうだ。 だから僕は、効率よりもソースコードの綺麗さを取ることにする。 これが100万行とかになると、1メソッドで1秒かかることになる。流石にそれはまずいので、 SQL分にWHERE句を追加して、RDBMSに条件の絞り込みの処理を任せる。 if,elseなどを使う必要がある場合はLINQを、最初から決まっている絞り込み条件の場合はそのままWHERE句を 使用する。そうすることにより、早さを維持しながらソースコードを綺麗にすることができる。
|
|