ものがたり(旧)

atsushieno.hatenablog.com に続く

何となくperformance tips

Arrayを確保すればいいところを、無駄にArrayListとか使ったりしていることってないですか?


Hashtable addNewCache = this.addNewCache;
rows = dataTable.Select (rowFilterExpr, null, RowStateFilter);< ArrayList al = new ArrayList ();< al.AddRange (rows);< al.AddRange (addNewCache.Keys);< rows = (DataRow []) al.ToArray (typeof (DataRow));
> DataRow [] tmp = new DataRow [rows.Length + addNewCache.Count];
> rows.CopyTo (tmp, 0);
> addNewCache.Keys.CopyTo (tmp, rows.Length);
> rows = tmp;
これは昨日の自分のcommitを読みやすいようにちょっと書き換えたdiffですが、こんだけでTotal memory allocatedが104304 KBから84771 KBくらいになることもありました。

もちろんメモリ確保量の大きいところを直さないと意味がないわけですが、mono --profileを使うと、メモリプロファイルの結果を最後の方に出力してくれるので、それなりに効率的に最適化ができます。