[VC2005] Win32_CacheMemoryを利用してキャッシュメモリサイズを取得する方法

◆概要

 マイクロソフト社のサポート情報にあるように、Win32_Processor WMI クラスの L2CacheSize プロパティは、特定の種類のプロセッサで正しく取得されないことがあります。たとえば、私のPCはPentium4 2.53GHzですが、2次キャッシュが0と表示されてしまいます。


 図1は、Win32_Processor WMI クラスを利用してCPU情報を表示させたものです。赤枠で示しているところがL2キャッシュです。本来、ここは512(KB)でなくてはなりませんが、0と表示されてしまっています。


図1


CPU情報


これを回避して、正しいキャッシュサイズを取得するには、Win32_CacheMemoryクラスのMaxCacheSizeプロパティを利用します。

 Win32_CacheMemoryクラスは、コンピュータのキャッシュメモリ(内部・外部)を表すWMIクラスです。

◆Sample Code

 リスト1は、1次キャッシュと2次キャッシュをコンソールに表示します。最初のキャッシュサイズが1次キャッシュ(内部キャッシュ)、2つめが2次キャッシュ(外部キャッシュ)です。

 まず、メニュー[プロジェクト]-[参照の追加]で、System.Managementをダブルクリックして追加してください。


 次に下記のコードを実装します。


リスト1

using System;
using System.Management;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementObjectSearcher searcher =
          new ManagementObjectSearcher(
                       "Select MaxCacheSize from Win32_CacheMemory");
            foreach (ManagementObject L2CacheSize in searcher.Get())
            {
                Console.WriteLine("キャッシュサイズ: {0}",
                              L2CacheSize.GetPropertyValue("MaxCacheSize"));
            }
            Console.ReadLine();
        }
    }
}

◆実行結果

図2


実行結果


◆LINQで取得する方法

C# 2008から利用できるLINQを使用した例です。

using System;
using System.Management;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var query = from mo in (new ManagementClass("Win32_CacheMemory")).
                    GetInstances().OfType<ManagementObject>()
                        from p in mo.Properties.OfType<PropertyData>()
                        where p.Name == "InstalledSize"
                        select p.Value;

            Console.WriteLine(query.ElementAt(0)); // 1次キャッシュ
            Console.WriteLine(query.ElementAt(1));  // 2次キャッシュ

            Console.ReadKey();
        }
    }
}

◆実行結果

図3


実行結果




▼ページトップへ