|
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