示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
文件: FlowIdTests.cs 项目: zeroyou/X
        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);
        }
示例#4
0
        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]);
            }
        }
示例#5
0
        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);
            }
        }
示例#6
0
        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})");
            }
        }
示例#7
0
文件: FlowIdTests.cs 项目: zeroyou/X
        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);
        }