首页 新闻 会员 周边 捐助

StackExchange.Redis异步api为什么反而比同步的慢?

0
悬赏园豆:5 [待解决问题]
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using StackExchange.Redis;
 7 using System.Diagnostics;
 8 
 9 
10 namespace HelloRedis
11 {
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             var redis = ConnectionMultiplexer.Connect("localhost:6379");
17             var db = redis.GetDatabase();
18 
19             db.StringSet("mykey", "fuck");
20 
21             Stopwatch sw = new Stopwatch();
22             sw.Start();
23             Parallel.For(0, 10000, (i) =>  {
24                 db.StringSet("mykey", i);
25             });
26             sw.Stop();
27             Console.WriteLine($"同步api耗时:{sw.ElapsedMilliseconds}");
28 
29 
30             sw.Restart();
31             Parallel.For(0, 10000,async (i) => {
32                 await db.StringSetAsync("mykey", i);
33             });
34             sw.Stop();
35             Console.WriteLine($"异步api耗时:{sw.ElapsedMilliseconds}");
36              
37             Console.ReadKey();
38         }
39     }
40 }


是跟redis采用单线程有关吗?还是我用法有误?
问题补充:

 

 

又补了两个

 

 Parallel.For(0, 10000,async (i) => {
                db.StringSetAsync("mykey", i);
            });
            sw.Stop();
            Console.WriteLine($"异步api耗时:{sw.ElapsedMilliseconds}");

//并行异步, 不要结果, 这时是21毫秒

  for (int i = 0; i <= 10000; i++)
            {
                db.StringSet("mykey", i);
            }
            
            sw.Stop();
//for循环同步不要结果301, 要结果就更多一点


            for (int i = 0; i <= 10000; i++)
            {
               db.StringSetAsync("mykey", i);
            }
            
            sw.Stop();
//for循环异步不要结果, 这种是最快的 只要12毫秒
kingcomxu的主页 kingcomxu | 初学一级 | 园豆:4
提问于:2016-08-09 11:28
< >
分享
所有回答(4)
0

等待的异步和同步没有区别.只是多了一层调用而已.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-08-09 11:37
0

异步只是提高了线程的利用率

dudu | 园豆:30778 (高人七级) | 2016-08-09 12:26
0

你的异步方法只有这一句 await db.StringSetAsync("mykey", i);  异步是让当前方法立即返回不阻塞其它语句的执行,但是你这样写就成了没有其它语句需要执行。。。反而因为你的方法是异步的,程序频繁查询db.StringSetAsync是否执行完,浪费更多时间。。不要认为异步就要更快。。异步只是不要让cpu在程序执行IO时等着,而是继续执行接下来的语句。。。不懂这么说你明白了没有。。。

smtctc | 园豆:219 (菜鸟二级) | 2016-08-09 15:54
0

你换成不同的key就知道了。

Daniel Cai | 园豆:10424 (专家六级) | 2016-08-09 16:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册