c# Task.Delay 和 HashedWheelTimer 性能对比

背景

定时或者延时,在游戏中有很广泛的使用。测试一下c#原生的Task.Delay和HashedWheelTimer性能对比

对比结果

其中HashedWheelTimer初始化为

new HashedWheelTimer(tickDuration: TimeSpan.FromMilliseconds(50)
                , ticksPerWheel: 100000
                , maxPendingTimeouts: 0);

通过对比结果,HashedWheelTimer的cpu占比更低,而且运行更精确
另外,内存消耗其实相差不大,就不贴了

方式任务数量最大超时时间(毫秒)cpu占比最终消耗时间(毫秒)
Task.Delay10000001500011%-31%20332
Task.Delay20000001500022%-35%30259
Task.Delay40000001500025%-35%64737
WheelTimer1000000150002%-9%17325
WheelTimer2000000150001%-13%18924
WheelTimer4000000150001%-15%26434

测试环境

在这里插入图片描述

测试代码


        static async void Test15()
        {
            int taskNum = 1000;
            int count = 0;
            int maxCount = taskNum;
            var wait = new BAwait(-1);
            var watch = new Stopwatch();
            watch.Start();
            for (int i = 0; i < taskNum; ++i)
            {
                Task.Run(async () =>
                {
                    try
                    {
                        int delayCount = 1000;
                        var tasks = new Task[delayCount];
                        var curWait = new BAwait(-1);
                        int curCount = 0;
                        for (int j = 0; j < delayCount; ++j)
                        {
                            tasks[j] = Task.Run(async()=>
                            {
                                try
                                {
                                    //await HashedWheelTimer.INSTANCE.Delay(BRand.Next(500, 15000));
                                    await Task.Delay(BRand.Next(500, 15000));
                                    var value1 = Interlocked.Increment(ref curCount);
                                    if (value1 >= delayCount)
                                    {
                                        curWait.Complete();
                                    }
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine($"eeeee={e.Message}");
                                }
                            });
                        }
                        await curWait;
                        var value = Interlocked.Increment(ref count);
                        if (value >= maxCount)
                        {
                            wait.Complete();
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"exception={e.Message}");
                    }
                });
            }
            await wait;
            watch.Stop();
            System.GC.Collect();
            Console.WriteLine($"finish:count={maxCount},cost={watch.ElapsedMilliseconds}");
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值