【发布时间】:2018-08-27 07:54:28
【问题描述】:
现在,我是线程和异步/同步编程以及所有这些东西的新手。所以,我一直在练习,在 youtube 上看到了这个问题。问题是对字节数组的每个内容求和。它来自名为 Jamie King 的频道。他用线程做到了这一点。我决定用任务来做这件事。我把它做成异步的,它比同步的慢。两者相差360毫秒!我想知道你们中的任何人是否可以以异步方式更快地完成它。如果有,请发帖! 这是我的:
static Random Random = new Random(999);
static byte[] byteArr = new byte[100_000_000];
static byte TaskCount = (byte)Environment.ProcessorCount;
static int readingLength;
static void Main(string[] args)
{
for (int i = 0; i < byteArr.Length; i++)
{
byteArr[i] = (byte)Random.Next(11);
}
SumAsync(byteArr);
}
static async void SumAsync(byte[] bytes)
{
readingLength = bytes.Length / TaskCount;
int sum = 0;
Console.WriteLine("Running...");
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < TaskCount; i++)
{
Task<int> task = SumPortion(bytes.SubArray(i * readingLength, readingLength));
int result = await task;
sum += result;
}
watch.Stop();
Console.WriteLine("Done! Time took: {0}, Result: {1}", watch.ElapsedMilliseconds, sum);
}
static async Task<int> SumPortion(byte[] bytes)
{
Task<int> task = Task.Run(() =>
{
int sum = 0;
foreach (byte b in bytes)
{
sum += b;
}
return sum;
});
int result = await task;
return result;
}
注意bytes.SubArray 是一种扩展方法。我有一个问题。异步编程比同步编程慢吗?
请指出我的错误。
感谢您的宝贵时间!
【问题讨论】:
-
你试过Parallel.For吗?不是异步的,但无论如何都是线程的。 docs.microsoft.com/en-us/dotnet/standard/parallel-programming/…
-
试试
int count = byteArr.AsParallel().Sum(x => x); -
这非常相关:stackoverflow.com/a/15665968/809357
async与并行计算无关。它是关于非阻塞主线程的。对于您的情况,启动新线程的成本很高 -
您的
SubArray()扩展方法是什么样的?我觉得很可疑。 -
@Nanhydrin 不,我还没开始。
标签: c# multithreading task