- - PR -
C# WMIのデータ取得を高速化したい
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-30 14:27
WMIデータの抽出が重いです。
WMIの抽出処理を高速にする工夫は無いでしょうか? やはりWQLで(SELECT文)を使用しているのが効率悪化の一因なのでしょうか? SELECT文を使わずに抽出する方法をあると聞きましたが、方法が分かりません。 単純な抽出の場合SELECT文を使わずに済むなら高速化できそうな気がします。 例 /// <summary> /// OS情報 /// </summary> public class Win32_OperatingSystem : WQL { /// <summary> /// コンストラクタ /// </summary> public Win32_OperatingSystem() : base("SELECT TotalVisibleMemorySize,FreePhysicalMemory FROM Win32_OperatingSystem") { } /// <summary> /// 物理メモリ(合計) /// </summary> /// <param name="index 番号"></param> /// <returns></returns> public ulong TotalVisibleMemorySize(int index) { object temp1 = Get("TotalVisibleMemorySize",index); return temp1 == null ? 0 : (ulong)temp1; } /// <summary> /// 物理メモリ(利用可能) /// </summary> /// <param name="index 番号"></param> /// <returns></returns> public ulong FreePhysicalMemory(int index) { object temp1 = Get("FreePhysicalMemory",index); return temp1 == null ? 0 : (ulong)temp1; } } /// <summary> /// WQL検索エンジン /// </summary> public abstract class WQL { /// <summary> /// コンストラクタ(WMIに問い合わせる) /// </summary> /// <param name="query"></param> public WQL(string query) { _query = query; ManagementScope scope = new ManagementScope("root\\cimv2"); scope.Connect(); System.Management.ObjectQuery q = new System.Management.ObjectQuery(_query); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, q); ManagementObjectCollection collection1 = searcher.Get(); _list = new ManagementObject[collection1.Count]; collection1.CopyTo(_list,0); } /// <summary> /// 問い合わせたデータから項目を抽出する /// </summary> /// <param name="item 項目名"></param> /// <param name="index 番号"></param> /// <returns></returns> protected object Get(string item,int index) { return _list[index].GetPropertyValue(item); } /// <summary> /// データ件数 /// </summary> public int Count { get { return _list.Length; } } private ManagementObject[] _list; private string _query; } | ||||||||
|
投稿日時: 2005-11-30 23:50
C# に関してはまったく疎いですが。 EnumerationOptions.ReturnImmediately プロパティ と思ったんですけど、Default True のようなので、 EnumerationOptions.Rewindable プロパティ を False にしてみる?
ManagementObject.Path に 対象の WMI Path を渡してやればできないのですかね。 [ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2005-12-01 00:08 ] | ||||||||
|
投稿日時: 2005-12-01 03:29
南部です。
ローカルマシンのTotalVisibleMemorySize、FreePhysicalMemory を取得してみましたが、600ミリ秒ほどでした。 (スペックはPen4の2.54GHz) コードは自分で書くのがめんどうだったので(こんな時間だし) mgmtclassgenを使用しました。 提示されたコードとの速度比較はしていませんので、 なんともいえませんが、参考まで。 #計測ミスのため修正 [ メッセージ編集済み 編集者: nanbu 編集日時 2005-12-01 03:53 ] | ||||||||
|
投稿日時: 2005-12-01 18:48
ご回答ありがとうございます。
WMIへのアクセスが軽くなりました。 (WMIは使いやすいので最近少しはまっています) |
1