现在,我对线程和异步/同步编程等技术都很陌生。因此,我一直在练习,并在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
是一个扩展方法。我有一个问题。异步编程比同步编程慢吗?
请指出我的错误。谢谢你的时间!
int count = byteArr.AsParallel().Sum(x => x);
。 - Matthew Watsonasync
不是关于并行计算的。它是关于非阻塞主线程的。对于您的情况,启动新线程的成本很高。 - trailmaxSubArray()
扩展方法是什么样子的?我觉得有点可疑。 - Matthew Watson