public void NewId() { var f = new Snowflake(); var id = f.NewId(); var time = id >> 22; var tt = f.StartTimestamp.AddMilliseconds(time); Assert.True(tt <= DateTime.Now); var wid = (id >> 12) & 0x3FF; Assert.Equal(f.WorkerId, wid); var seq = id & 0x0FFF; //Assert.Equal(f.Sequence, seq); // 时间转编号 var id2 = f.GetId(tt); Assert.Equal(id >> 22, id2 >> 22); // 分析 var rs = f.TryParse(id, out var t, out var w, out var s); Assert.True(rs); Assert.Equal(tt, t); Assert.Equal(wid, w); Assert.Equal(seq, s); }
private static void Test2() { var sw = Stopwatch.StartNew(); var count = 100_000_000L; var ts = new List <Task>(); for (var i = 0; i < Environment.ProcessorCount; i++) { ts.Add(Task.Run(() => { var f = new Snowflake(); for (var i = 0; i < count; i++) { var id = f.NewId(); } })); } Task.WaitAll(ts.ToArray()); sw.Stop(); count *= ts.Count; XTrace.WriteLine("生成 {0:n0},耗时 {1},速度 {2:n0}tps", count, sw.Elapsed, count * 1000 / sw.ElapsedMilliseconds); }
public void Benchmark() { var sw = Stopwatch.StartNew(); var count = 10_000_000L; var ts = new List <Task>(); for (var i = 0; i < 1; i++) { ts.Add(Task.Run(() => { var f = new Snowflake(); for (var i = 0; i < count; i++) { var id = f.NewId(); } })); } Task.WaitAll(ts.ToArray()); sw.Stop(); Assert.True(sw.ElapsedMilliseconds < 10_000); count *= ts.Count; XTrace.WriteLine("生成 {0:n0},耗时 {1},速度 {2:n0}tps", count, sw.Elapsed, count * 1000 / sw.ElapsedMilliseconds); }
public void ValidRepeat() { var sw = Stopwatch.StartNew(); //var ws = new ConcurrentBag<Int32>(); var ws = new ConcurrentDictionary <Int32, Snowflake>(); //var repeat = new ConcurrentBag<Int64>(); var hash = new ConcurrentDictionary <Int64, Snowflake>(); var ts = new List <Task>(); var ss = new Int64[2]; var rs = new List <Int64> [ss.Length]; for (var k = 0; k < ss.Length; k++) { // 提前计算workerId到本地变量,避免匿名函数闭包里面产生重复 var wid = (k + 1) & 0x3FF; var idx = k; ts.Add(Task.Run(() => { var repeat = new List <Int64>(); var f = new Snowflake { StartTimestamp = new DateTime(2020, 1, 1), WorkerId = wid }; //ws.Add(f.WorkerId); Assert.True(ws.TryAdd(f.WorkerId, f)); //if (!ws.TryAdd(f.WorkerId, f)) Assert.True(false); for (var i = 0; i < 100_000; i++) { var id = f.NewId(); if (!hash.TryAdd(id, f)) { hash.TryGetValue(id, out var f2); repeat.Add(id); } ss[wid - 1]++; } rs[wid - 1] = repeat; })); } Task.WaitAll(ts.ToArray()); sw.Stop(); Assert.True(sw.ElapsedMilliseconds < 10_000); //var count = repeat.Count; //Assert.Equal(0, count); for (var i = 0; i < ss.Length; i++) { Assert.Empty(rs[i]); } }
public void GlobalWorkerId() { { var n = Rand.Next(0x400); Snowflake.GlobalWorkerId = n; var sn = new Snowflake(); sn.NewId(); Assert.Equal(n, sn.WorkerId); } { var n = Rand.Next(0x400, Int32.MaxValue); Snowflake.GlobalWorkerId = n; var sn = new Snowflake(); sn.NewId(); Assert.Equal(n & 0x3FF, sn.WorkerId); } }
private void btnSnowflake_Click(Object sender, EventArgs e) { var v = rtSource.Text.ToLong(); if (v <= 0) { return; } var snow = new Snowflake(); // 指定基准时间 if (!rtPass.Text.IsNullOrEmpty()) { var baseTime = rtPass.Text.ToDateTime(); if (baseTime.Year > 1000) { snow.StartTimestamp = baseTime; } } // 计算结果 { if (!snow.TryParse(v, out var time, out var workerId, out var sequence)) { throw new Exception("解码失败!"); } // 初始化一次,用于获取本机workerId snow.NewId(); var t = (Int64)(time - snow.StartTimestamp).TotalMilliseconds; SetResult( $"十六:{v:X16}", $"编码:{(t << 2):X8} {workerId:X2} {sequence:X3}", $"基准:{snow.StartTimestamp:yyyy-MM-dd}", $"时间:{time.ToFullString()} ({t} / {(t << 22):X8})", $"节点:{workerId} ({workerId:X4})", $"序号:{sequence} ({sequence:X4})", $"本机:{snow.WorkerId} ({snow.WorkerId:X4})"); } }
public void ValidRepeat() { var sw = Stopwatch.StartNew(); var ws = new ConcurrentBag <Int32>(); var repeat = new ConcurrentBag <Int64>(); var hash = new ConcurrentHashSet <Int64>(); var ts = new List <Task>(); for (var k = 0; k < 10; k++) { ts.Add(Task.Run(() => { var f = new Snowflake { StartTimestamp = new DateTime(2020, 1, 1), WorkerId = Rand.Next() & 0x3FF }; ws.Add(f.WorkerId); for (var i = 0; i < 100_000; i++) { var id = f.NewId(); if (!hash.TryAdd(id)) { repeat.Add(id); } } })); } Task.WaitAll(ts.ToArray()); sw.Stop(); Assert.True(sw.ElapsedMilliseconds < 10_000); var count = repeat.Count; Assert.Equal(0, count); }