|
class CPUTest
{
//获取系统运行时间毫秒级别
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
//SetThreadAffinityMask 指定hThread 运行在 核心 dwThreadAffinityMask
[DllImport("kernel32.dll")]
static extern UIntPtr SetThreadAffinityMask(IntPtr hThread,UIntPtr dwThreadAffinityMask);
//得到当前线程的handler
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
static int busyTime = 10;
static int idleTime = busyTime;
//设置线程数目
static int threads = 8;
public static void changeValue(object pid)
{
int core = (int)pid;
int len = 100000000;
uint[] data = new uint[len];
//将当前线程绑定到指定的cpu核心上
SetThreadAffinityMask(GetCurrentThread(), new UIntPtr(SetCpuID(core)));
Console.WriteLine("运行线程:" + SetCpuID(core).ToString());
uint startTime = GetTickCount();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < len; ++i)
{
data[i] = GetTickCount();
// Thread.Sleep(10);
}
stopwatch.Stop();
Console.WriteLine("运行时间" + stopwatch.ElapsedMilliseconds.ToString());
}
//获取cpu的id号
static ulong SetCpuID(int id)
{
ulong cpuid = 0;
if (id < 0 || id >= System.Environment.ProcessorCount)
{
id = 0;
}
cpuid |= 1UL << id;
return cpuid;
}
public static void Test()
{
//ManagementClass c = new ManagementClass(new ManagementPath("Win32_Processor"));
//ManagementObjectCollection moc = c.GetInstances();
//foreach (ManagementObject mo in moc)
//{
// PropertyDataCollection properties = mo.Properties;
// //获取内核数代码
// string cpu = "物理内核数:" + properties["NumberOfCores"].Value + "\r";
// string total = "逻辑内核数:" + properties["NumberOfLogicalProcessors"].Value + "\r";
// Console.WriteLine(cpu);
// //其他属性获取代码
// //foreach (PropertyData property in properties)
// //{
// // Console.WriteLine( property.Name + ":" + property.Value + "\r");
// //}
//}
//线程数目
int num = threads;
Console.WriteLine("线程数目" + num);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
List<Task> tasks = new List<Task>();
for (int i = 3; i < num; i++)
{
int k = i;
tasks.Add(Task.Run(() =>
{
changeValue(k);
}));
}
Task.WaitAll(tasks.ToArray());
stopwatch.Stop();
Console.WriteLine("总运行时间" + stopwatch.ElapsedMilliseconds.ToString());
Console.ReadKey();
}
} |
|