C# 为什么wait-async这么慢?
我终于得到了VS2012,并得到了一个简单的演示,并努力检查async和await的潜在性能提升,但令我沮丧的是,它速度较慢!我可能做错了什么,但也许你能帮我。(我还添加了一个简单的线程解决方案,运行速度如预期的那样快) 我的代码使用一个类根据系统上的内核数对数组求和(-1)我的代码有4个内核,所以我看到线程的速度提高了2倍(2.5个线程),但使用async/await时,同样的速度降低了2倍 代码:(注意,您需要添加对C# 为什么wait-async这么慢?,c#,multithreading,performance,.net-4.5,async-await,C#,Multithreading,Performance,.net 4.5,Async Await,我终于得到了VS2012,并得到了一个简单的演示,并努力检查async和await的潜在性能提升,但令我沮丧的是,它速度较慢!我可能做错了什么,但也许你能帮我。(我还添加了一个简单的线程解决方案,运行速度如预期的那样快) 我的代码使用一个类根据系统上的内核数对数组求和(-1)我的代码有4个内核,所以我看到线程的速度提高了2倍(2.5个线程),但使用async/await时,同样的速度降低了2倍 代码:(注意,您需要添加对System.Management的引用,以使堆芯探测器正常工作) 使用系统
System.Management
的引用,以使堆芯探测器正常工作)
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用系统线程;
使用制度管理;
使用系统诊断;
命名空间异步和
{
班级计划
{
静态字符串结果=”;
静态void Main(字符串[]参数)
{
任务t=Run();
t、 等待();
控制台写入线(结果);
Console.ReadKey();
}
静态异步任务运行()
{
随机=新随机();
int[]巨大=新int[1000000];
for(int i=0;i
{
长asum=0;
对于(int a=start;a
{
长asum=0;
对于(int a=start;a
{
int start=i*ChunkSize;
int end=开始+ChunkSize;
int bucket=i;
长asum=0;
对于(int a=start;a
有什么想法吗?我是否执行了异步/等待错误?我很乐意尝试任何建议
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Management;
using System.Diagnostics;
namespace AsyncSum
{
class Program
{
static string Results = "";
static void Main(string[] args)
{
Task t = Run();
t.Wait();
Console.WriteLine(Results);
Console.ReadKey();
}
static async Task Run()
{
Random random = new Random();
int[] huge = new int[1000000];
for (int i = 0; i < huge.Length; i++)
{
huge[i] = random.Next(2);
}
ArraySum summer = new ArraySum(huge);
Stopwatch sw = new Stopwatch();
sw.Restart();
long tSum = summer.Sum();
for (int i = 0; i < 100; i++)
{
tSum = summer.Sum();
}
long tticks = sw.ElapsedTicks / 100;
long aSum = await summer.SumAsync();
sw.Restart();
for (int i = 0; i < 100; i++)
{
aSum = await summer.SumAsync();
}
long aticks = sw.ElapsedTicks / 100;
long dSum = summer.SumThreaded();
sw.Restart();
for (int i = 0; i < 100; i++)
{
dSum = summer.SumThreaded();
}
long dticks = sw.ElapsedTicks / 100;
long pSum = summer.SumParallel();
sw.Restart();
for (int i = 0; i < 100; i++)
{
pSum = summer.SumParallel();
}
long pticks = sw.ElapsedTicks / 100;
Program.Results += String.Format("Regular Sum: {0} in {1} ticks\n", tSum, tticks);
Program.Results += String.Format("Async Sum: {0} in {1} ticks\n", aSum, aticks);
Program.Results += String.Format("Threaded Sum: {0} in {1} ticks\n", dSum, dticks);
Program.Results += String.Format("Parallel Sum: {0} in {1} ticks\n", pSum, pticks);
}
}
class ArraySum
{
int[] Data;
int ChunkSize = 1000;
int cores = 1;
public ArraySum(int[] data)
{
Data = data;
cores = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
cores += int.Parse(item["NumberOfCores"].ToString());
}
cores--;
if (cores < 1) cores = 1;
ChunkSize = Data.Length / cores + 1;
}
public long Sum()
{
long sum = 0;
for (int i = 0; i < Data.Length; i++)
{
sum += Data[i];
}
return sum;
}
public async Task<long> SumAsync()
{
Task<long>[] psums = new Task<long>[cores];
for (int i = 0; i < psums.Length; i++)
{
int start = i * ChunkSize;
int end = start + ChunkSize;
psums[i] = Task.Run<long>(() =>
{
long asum = 0;
for (int a = start; a < end && a < Data.Length; a++)
{
asum += Data[a];
}
return asum;
});
}
long sum = 0;
for (int i = 0; i < psums.Length; i++)
{
sum += await psums[i];
}
return sum;
}
public long SumThreaded()
{
long sum = 0;
Thread[] threads = new Thread[cores];
long[] buckets = new long[cores];
for (int i = 0; i < cores; i++)
{
int start = i * ChunkSize;
int end = start + ChunkSize;
int bucket = i;
threads[i] = new Thread(new ThreadStart(() =>
{
long asum = 0;
for (int a = start; a < end && a < Data.Length; a++)
{
asum += Data[a];
}
buckets[bucket] = asum;
}));
threads[i].Start();
}
for (int i = 0; i < cores; i++)
{
threads[i].Join();
sum += buckets[i];
}
return sum;
}
public long SumParallel()
{
long sum = 0;
long[] buckets = new long[cores];
ParallelLoopResult lr = Parallel.For(0, cores, new Action<int>((i) =>
{
int start = i * ChunkSize;
int end = start + ChunkSize;
int bucket = i;
long asum = 0;
for (int a = start; a < end && a < Data.Length; a++)
{
asum += Data[a];
}
buckets[bucket] = asum;
}));
for (int i = 0; i < cores; i++)
{
sum += buckets[i];
}
return sum;
}
}
}
public static int Sum(int[] array)
{
return array.AsParallel().Sum();
}
Regular Sum: 499946 in 00:00:00.0047378
Async Sum: 499946 in 00:00:00.0016994
Threaded Sum: 499946 in 00:00:00.0026898