|
1 | 1 | using Enyim.Caching; |
2 | 2 | using Microsoft.Extensions.Configuration; |
3 | 3 | using Microsoft.Extensions.DependencyInjection; |
| 4 | +using Microsoft.Extensions.Hosting; |
4 | 5 | using Microsoft.Extensions.Logging; |
5 | 6 | using System; |
6 | 7 | using System.Diagnostics; |
|
10 | 11 |
|
11 | 12 | namespace Enyim.StressTest |
12 | 13 | { |
| 14 | + |
13 | 15 | class Foo |
14 | 16 | { |
15 | 17 | public int[] Numbers { get; set; } |
16 | | - public DateTime DateTime { get; set; } |
| 18 | + public DateTime DateTime { get; set; } = DateTime.Now; |
17 | 19 | } |
18 | 20 |
|
19 | 21 | //From https://github.com/ZeekoZhu/memcachedcore-stress |
20 | 22 | class Program |
21 | 23 | { |
| 24 | + private static IMemcachedClient _memcachedClient; |
| 25 | + private static int _runTimes = 100000; |
| 26 | + private static readonly string _cacheKey = "enyim-stress-test"; |
| 27 | + private static ILogger _logger; |
| 28 | + |
22 | 29 | static async Task Main(string[] args) |
23 | 30 | { |
24 | | - var services = new ServiceCollection(); |
25 | | - services.AddEnyimMemcached(options => options.AddServer("memcached", 11211)); |
26 | | - services.AddLogging(x => x.AddConsole().SetMinimumLevel(LogLevel.Debug)); |
27 | | - await Run(services.BuildServiceProvider()); |
| 31 | + var host = new HostBuilder() |
| 32 | + .ConfigureHostConfiguration(_ => _.AddJsonFile("appsettings.json", true)) |
| 33 | + .ConfigureLogging(_ => _.AddConsole()) |
| 34 | + .ConfigureServices(_ => _.AddEnyimMemcached()) |
| 35 | + .Build(); |
| 36 | + |
| 37 | + _memcachedClient = host.Services.GetRequiredService<IMemcachedClient>(); |
| 38 | + _logger = host.Services.GetRequiredService<ILogger<Program>>(); |
| 39 | + var runTimes = host.Services.GetRequiredService<IConfiguration>().GetValue<int?>("RunTimes"); |
| 40 | + _runTimes = runTimes.HasValue ? runTimes.Value : _runTimes; |
| 41 | + |
| 42 | + await Run(); |
28 | 43 | } |
29 | 44 |
|
30 | | - static async Task TrySingle(IServiceProvider sp) |
| 45 | + static async Task TrySingle() |
31 | 46 | { |
32 | | - using (var scope = sp.CreateScope()) |
33 | | - { |
34 | | - var memcached = scope.ServiceProvider.GetService<IMemcachedClient>(); |
35 | | - memcached.Add("test", new Foo(), Int32.MaxValue); |
36 | | - var test = await memcached.GetValueAsync<Foo>("test"); |
37 | | - Console.WriteLine("Single Run: {0}", test.DateTime); |
38 | | - } |
| 47 | + await _memcachedClient.SetAsync(_cacheKey, new Foo(), 36000); |
| 48 | + var test = await _memcachedClient.GetValueAsync<Foo>(_cacheKey); |
| 49 | + Console.WriteLine("Single Run: {0}", test.DateTime); |
39 | 50 | } |
40 | 51 |
|
41 | | - static async Task RunSync(int cnt, IServiceProvider sp) |
| 52 | + static async Task RunSync(int cnt) |
42 | 53 | { |
43 | 54 | Console.WriteLine("Use Get"); |
44 | | - await TrySingle(sp); |
| 55 | + await TrySingle(); |
45 | 56 | var sw = Stopwatch.StartNew(); |
46 | | - var obj = new object(); |
47 | 57 | var errCnt = 0; |
48 | | - var tasks = |
49 | | - Enumerable.Range(0, cnt) |
| 58 | + var tasks = Enumerable.Range(0, cnt) |
50 | 59 | .Select(i => Task.Run(() => |
51 | 60 | { |
52 | | - using (var scope = sp.CreateScope()) |
| 61 | + |
| 62 | + try |
53 | 63 | { |
54 | | - var provider = scope.ServiceProvider; |
55 | | - var memcached = provider.GetService<IMemcachedClient>(); |
56 | | - try |
57 | | - { |
58 | | - var foo = memcached.Get<Foo>("test"); |
59 | | - if (foo == null) |
60 | | - { |
61 | | - throw new Exception(); |
62 | | - } |
63 | | - } |
64 | | - catch (Exception e) |
| 64 | + var foo = _memcachedClient.Get<Foo>(_cacheKey); |
| 65 | + if (foo == null) |
65 | 66 | { |
66 | | - lock (obj) |
67 | | - { |
68 | | - errCnt += 1; |
69 | | - } |
70 | | - |
71 | | - // Console.WriteLine("Task: {0} Exception: {1}", i, e.GetType().FullName); |
| 67 | + Interlocked.Increment(ref errCnt); |
72 | 68 | } |
73 | 69 | } |
| 70 | + catch (Exception e) |
| 71 | + { |
| 72 | + Interlocked.Increment(ref errCnt); |
| 73 | + } |
74 | 74 | })); |
75 | 75 | await Task.WhenAll(tasks); |
76 | 76 | sw.Stop(); |
| 77 | + |
77 | 78 | Thread.Sleep(TimeSpan.FromSeconds(3)); |
78 | | - await TrySingle(sp); |
| 79 | + await TrySingle(); |
79 | 80 | Console.WriteLine($"Time: {sw.ElapsedMilliseconds}ms"); |
80 | 81 | Console.WriteLine($"Error Cnt: {errCnt}"); |
81 | 82 | Console.WriteLine($"Avg: {Convert.ToDouble(sw.ElapsedMilliseconds) / Convert.ToDouble(cnt)}ms"); |
82 | 83 | } |
83 | 84 |
|
84 | | - static async Task RunAsync(int cnt, IServiceProvider sp) |
| 85 | + static async Task RunAsync(int cnt) |
85 | 86 | { |
86 | 87 | Console.WriteLine("Use GetValueAsync"); |
87 | | - await TrySingle(sp); |
| 88 | + await TrySingle(); |
88 | 89 | var sw = Stopwatch.StartNew(); |
89 | 90 | var obj = new object(); |
90 | 91 | var errCnt = 0; |
91 | | - var tasks = |
92 | | - Enumerable.Range(0, cnt) |
| 92 | + var tasks = Enumerable.Range(0, cnt) |
93 | 93 | .Select(i => Task.Run(async () => |
94 | 94 | { |
95 | | - using (var scope = sp.CreateScope()) |
| 95 | + try |
96 | 96 | { |
97 | | - var provider = scope.ServiceProvider; |
98 | | - var memcached = provider.GetService<IMemcachedClient>(); |
99 | | - try |
100 | | - { |
101 | | - var foo = await memcached.GetValueAsync<Foo>("test"); |
102 | | - if (foo == null) |
103 | | - { |
104 | | - throw new Exception(); |
105 | | - } |
106 | | - } |
107 | | - catch (Exception e) |
| 97 | + var foo = await _memcachedClient.GetValueAsync<Foo>(_cacheKey); |
| 98 | + if (foo == null) |
108 | 99 | { |
109 | | - lock (obj) |
110 | | - { |
111 | | - errCnt += 1; |
112 | | - } |
113 | | - |
114 | | - //Console.WriteLine("Task: {0} Exception: {1}", i, e.GetType().FullName); |
| 100 | + _logger.LogError("GetValueAsync return null"); |
| 101 | + Interlocked.Increment(ref errCnt); |
115 | 102 | } |
116 | 103 | } |
| 104 | + catch (Exception ex) |
| 105 | + { |
| 106 | + _logger.LogError(ex, $"Exception on GetValueAsync"); |
| 107 | + Interlocked.Increment(ref errCnt); |
| 108 | + } |
117 | 109 | })); |
118 | 110 | await Task.WhenAll(tasks); |
119 | 111 | sw.Stop(); |
120 | 112 | Thread.Sleep(TimeSpan.FromSeconds(3)); |
121 | | - await TrySingle(sp); |
| 113 | + await TrySingle(); |
122 | 114 | Console.WriteLine($"Time: {sw.ElapsedMilliseconds}ms"); |
123 | 115 | Console.WriteLine($"Error Cnt: {errCnt}"); |
124 | 116 | Console.WriteLine($"Avg: {Convert.ToDouble(sw.ElapsedMilliseconds) / Convert.ToDouble(cnt)}ms"); |
125 | 117 | } |
126 | 118 |
|
127 | | - static async Task Run(IServiceProvider sp) |
| 119 | + static async Task Run() |
128 | 120 | { |
129 | | - var cnt = 1000000; |
130 | | - await RunAsync(cnt, sp); |
131 | | - await RunSync(cnt, sp); |
| 121 | + var cnt = _runTimes; |
| 122 | + await RunAsync(cnt); |
| 123 | + //await RunSync(cnt); |
132 | 124 | } |
133 | 125 | } |
134 | 126 | } |
0 commit comments