181 lines
5.4 KiB
C#
181 lines
5.4 KiB
C#
using System;
|
||
using System.Diagnostics;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
|
||
class Program
|
||
{
|
||
static void Main()
|
||
{
|
||
// 提示用户程序开始
|
||
Console.WriteLine("开始测试 CPU 性能,请稍等...");
|
||
|
||
// 获取当前时间戳
|
||
var stopwatch = new Stopwatch();
|
||
|
||
// 单核性能测试
|
||
Console.WriteLine("\n开始单核性能测试...");
|
||
stopwatch.Start();
|
||
TestSingleCorePerformance();
|
||
stopwatch.Stop();
|
||
Console.WriteLine($"单核测试耗时:{stopwatch.ElapsedMilliseconds} 毫秒");
|
||
|
||
// 多核性能测试
|
||
Console.WriteLine("\n开始多核性能测试...");
|
||
stopwatch.Restart();
|
||
TestMultiCorePerformance();
|
||
stopwatch.Stop();
|
||
Console.WriteLine($"多核测试耗时:{stopwatch.ElapsedMilliseconds} 毫秒");
|
||
|
||
// 暂停程序,等待用户查看结果
|
||
Console.WriteLine("按任意键退出...");
|
||
Console.ReadKey();
|
||
}
|
||
|
||
// 单核性能测试:在一个线程上执行计算
|
||
static void TestSingleCorePerformance()
|
||
{
|
||
int iterations = 10000000; // 迭代次数,用于增加计算量
|
||
|
||
// 1. 递归斐波那契数列
|
||
Console.WriteLine("计算递归斐波那契数列...");
|
||
var fibResult = Fibonacci(40); // 递归计算斐波那契数列
|
||
Console.WriteLine($"斐波那契结果:{fibResult}");
|
||
|
||
// 2. 数值积分
|
||
Console.WriteLine("计算数值积分...");
|
||
double integralResult = TrapezoidalRule(0, Math.PI, iterations, Math.Sin);
|
||
Console.WriteLine($"积分结果:{integralResult}");
|
||
|
||
// 3. 素数筛选
|
||
Console.WriteLine("筛选素数...");
|
||
var primes = SieveOfEratosthenes(iterations); // 返回 int[] 数组
|
||
Console.WriteLine($"找到的素数个数:{primes.Length}");
|
||
|
||
// 4. 矩阵乘法
|
||
Console.WriteLine("进行矩阵乘法...");
|
||
var matrixResult = MatrixMultiplication(5000);
|
||
Console.WriteLine($"矩阵乘法结果第一项:{matrixResult[0, 0]}");
|
||
}
|
||
|
||
// 多核性能测试:使用 Parallel.For 来并行执行任务
|
||
static void TestMultiCorePerformance()
|
||
{
|
||
long iterationsPerCore = 25000000; // 每个核心的计算迭代次数
|
||
int coreCount = Environment.ProcessorCount; // 获取当前计算机的核心数
|
||
double[] results = new double[coreCount]; // 存储每个核心的计算结果
|
||
|
||
// 使用 Parallel.For 来并行计算
|
||
Parallel.For(0, coreCount, coreIndex =>
|
||
{
|
||
// 1. 数值积分
|
||
double result = TrapezoidalRule(0, Math.PI, 1000000, Math.Sin);
|
||
|
||
// 2. 素数筛选
|
||
var primes = SieveOfEratosthenes(1000000);
|
||
|
||
// 3. 矩阵乘法
|
||
var matrixResult = MatrixMultiplication(500);
|
||
result += matrixResult[0, 0];
|
||
|
||
results[coreIndex] = result; // 存储每个核心的计算结果
|
||
});
|
||
|
||
// 输出每个核心的计算结果(仅作为占位符)
|
||
for (int i = 0; i < coreCount; i++)
|
||
{
|
||
Console.WriteLine($"核心 {i + 1} 的计算结果:{results[i]}");
|
||
}
|
||
}
|
||
|
||
// 递归计算斐波那契数列
|
||
static long Fibonacci(int n)
|
||
{
|
||
if (n <= 1)
|
||
return n;
|
||
return Fibonacci(n - 1) + Fibonacci(n - 2);
|
||
}
|
||
|
||
// 数值积分:梯形法则
|
||
static double TrapezoidalRule(double a, double b, int n, Func<double, double> f)
|
||
{
|
||
double h = (b - a) / n;
|
||
double sum = (f(a) + f(b)) / 2.0;
|
||
|
||
for (int i = 1; i < n; i++)
|
||
{
|
||
sum += f(a + i * h);
|
||
}
|
||
|
||
return sum * h;
|
||
}
|
||
|
||
// 埃拉托斯特尼筛法:筛选素数
|
||
static int[] SieveOfEratosthenes(int limit)
|
||
{
|
||
// 创建布尔数组,true表示该位置是素数,false表示不是素数
|
||
bool[] sieve = new bool[limit + 1];
|
||
for (int i = 2; i <= limit; i++)
|
||
{
|
||
sieve[i] = true;
|
||
}
|
||
|
||
// 筛选出素数
|
||
for (int i = 2; i * i <= limit; i++)
|
||
{
|
||
if (sieve[i])
|
||
{
|
||
for (int j = i * i; j <= limit; j += i)
|
||
{
|
||
sieve[j] = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 将布尔数组中的素数转化为整数数组
|
||
var primesList = new System.Collections.Generic.List<int>();
|
||
for (int i = 2; i <= limit; i++)
|
||
{
|
||
if (sieve[i])
|
||
{
|
||
primesList.Add(i);
|
||
}
|
||
}
|
||
|
||
return primesList.ToArray(); // 返回素数数组
|
||
}
|
||
|
||
// 矩阵乘法:两个大矩阵的乘法
|
||
static double[,] MatrixMultiplication(int size)
|
||
{
|
||
double[,] matrixA = new double[size, size];
|
||
double[,] matrixB = new double[size, size];
|
||
double[,] result = new double[size, size];
|
||
|
||
// 初始化矩阵A和矩阵B
|
||
Random rand = new Random();
|
||
for (int i = 0; i < size; i++)
|
||
{
|
||
for (int j = 0; j < size; j++)
|
||
{
|
||
matrixA[i, j] = rand.NextDouble();
|
||
matrixB[i, j] = rand.NextDouble();
|
||
}
|
||
}
|
||
|
||
// 矩阵相乘
|
||
for (int i = 0; i < size; i++)
|
||
{
|
||
for (int j = 0; j < size; j++)
|
||
{
|
||
for (int k = 0; k < size; k++)
|
||
{
|
||
result[i, j] += matrixA[i, k] * matrixB[k, j];
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
}
|