async与await属于异步,应该比同步执行要快点,为啥我的for循环却比直接使用for快些
public static void TestTask()
{
for(int i=0;i<10000;i++)
{
Console.Write(i);
}
}
public async static void TestTask2()
{
await Task.Run(() =>
{
TestTask);
});
}
什么意思?没明白你说的是什么
就是我写的例子的for循环比async与await效率高些,还是我哪里写错了。。
@灬丶: 奥,await不会提高效率,
@博学多思: 那这个有什么用,异步不就是为了提高效率
@灬丶: 有些场景使用异步可以提高效率,有些反而会降低效率
@博学多思: 那我那个写法是对的吗?在TestTask2()里面调用TestTask()方法
@灬丶: 很明显不对啊
@博学多思: 为啥?
@灬丶: 用的场合不对呗,你不也测试了,速度变慢了,,,这还有为啥,,,,
好好看看操作系统吧。
。。。。
首先你要清楚一个道理,
async异步的是线程不是方法,await等待的也是线程不是方法。
async/await本身是多线程的控制符,标识着当前线程与子线程中的同步关系。本身并没有提升效率的效果。
建议先了解一下C#中的Task。
你给的代码中,你在 TestTask2 启动了一个等待的线程,那么系统会等子线程执行结束后,再向下执行。这就和同步没什么区别了。但是多线程这个东西,CPU在多个线程间切换是需要开销的。那么自然就比单一线程执行起来要慢。
随便写一段,你先研究研究去
class Program { static int count = 0; static Stopwatch stopwatch = new Stopwatch(); static void Main(string[] args) { stopwatch.Start(); Console.WriteLine("Start RunAsync"); RunAsync(); while (count < 4) { } stopwatch.Stop(); Console.WriteLine($"all finish, use time : {stopwatch.ElapsedMilliseconds} ms"); count = 0; stopwatch.Restart(); Console.WriteLine("Start Run"); Run(); while (count < 4) { } stopwatch.Stop(); Console.WriteLine($"all finish, use time : {stopwatch.ElapsedMilliseconds} ms"); Console.ReadKey(); } static void Run() { Test("aaa"); Test("bbb"); Test("ccc"); Test("ddd"); } static async void RunAsync() { await Test("aaa"); await Test("bbb"); await Test("ccc"); await Test("ddd"); } private static async Task<int> Test(string name) { return await Task.Run(() => { System.Threading.Thread.Sleep(1000); return count++; }); } }
async/await 合适处理耗时耗IO的多线程任务,async/await会从当前可用线程中找出空闲的线程来执行,让所有线程都别闲着从而提高服务的吞吐量。
你这个例子完全是不对的,TestTask如果理解为一个任务,那么TestTask2就是“开启一个空闲线程去执行TestTask任务(如果没有空闲线程会新开一个线程)”。如果TestTask耗时1s,TestTask2耗时1.2秒,那么基本可以理解成async/await 开启空闲线程/新开线程,花了0.2s。
多线程只有在高并发的情况下能提升性能,如果任务只需要一个线程去做,并且不能并行去做,同步方法当然性能更高,因为分配线程也是需要性能损耗的。
并行跟异步不是一样的哦,了解一下并行编程