Esempio n. 1
0
File: Program.cs Progetto: well-he/X
        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 FlowId();

                    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);
        }
Esempio n. 2
0
        public void Benchmark()
        {
            var sw = Stopwatch.StartNew();

            var count = 10_000_000L;

            var ts = new List <Task>();

            for (var i = 0; i < Environment.ProcessorCount; i++)
            {
                ts.Add(Task.Run(() =>
                {
                    var f = new FlowId {
                        BlockOnSampleTime = false
                    };

                    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);
        }
Esempio n. 3
0
        public void NewId()
        {
            var f  = new FlowId();
            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);
        }
Esempio n. 4
0
        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 FlowId {
                        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);
        }