« 05.28 超高速化してしまった | ココ | 05.29 映画が見たい »

2005年5月28日

速くするには手間を少なくすればいい  このエントリーを含むはてなブックマーク 

無茶なデータ量を処理するときは、やはりそれなりに時間は掛かるもの。しかし速く終わるに越したことはない。そのためにはできるだけ計算を単純にし、処理にかけるステップ数を少なくすることが必要です。同じ結果を得るものでも、そのための過程が少なければ少ないほど結果に到達する速度が上がることは暗算をするときに式が短いほど計算が速くなることを思い起こせば理解は簡単ですね。


Windowsなどではもうオブジェクト指向プログラミングが定着しつつあり、VBをはじめほとんどのプログラム言語である機能集団を一つの塊(オブジェクト)として扱い、それを変数としてアクセスすることを行っています。もう既にライブラリとして用意されているものに関しては仕方のないことですが、同じことをするのでも速く終わらせるためには工夫が必要です。以下に例を示します。

' 重複しないようにArrayListに数値を追加する
Dim arr As ArrayList ' すでにデータが入っている

Dim arr2 As New ArrayList2 ' こちらにデータを追加する(Addメソッドをオーバーライドしている)
Dim i As Integer

arr.Sort() ' ソートをしておく

For i = 0 To arr.Count - 1
  arr2.Add(arr(i))
Next

----
Class ArrayList2
  Inherits ArrayList

  Public Overrides Function Add(ByVal val As Integer) As Integer
    If arr2.IndexOf(val) < 0 Then Return MyBase.Add(val)

  End Function
End Class

これはこのように書き換えられます。

' 重複しないようにArrayListに数値を追加する
Dim arr As ArrayList ' すでにデータが入っている

Dim arr2 As New ArrayList2 ' こちらにデータを追加する(Addメソッドをオーバーライドしている)
Dim i As Integer

arr.Sort() ' ソートをしておく

For i = 0 To arr.Count - 1
  If i > 0 Then
    If arr(i - 1) <> arr(i) Then arr2.Add(arr(i))
  Else
    arr2.Add(arr(i))
  End If
Next

IndexOfメソッドは、配列の最初から順番に一致するものを探す関数です。なので、配列の要素数が少ないときは時間への影響は小さいですが量が増えるに従ってその影響は増します。特にarrの中身がオブジェクトであるときなどは、さらにメモリアクセスが増えるためにより時間が掛かるのでオブジェクトにアクセスするのを避ける手段を使うか、変数に一時的に代入するなどしてステップ数を下げることが重要です。

By ただ at 21:37 カテゴリー ; さんぷるライブラリー , PinMarch Samples , VB, VB .net

« 05.28 超高速化してしまった | 05月の記事 | 05.29 映画が見たい »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/59