Exemple #1
0
        private void Perf_test_single_thread_put_peek_and_take(ITransactionalQueue <XDoc> queue)
        {
            long totalEnqueue = 0;
            long totalDequeue = 0;
            var  n            = 20000;
            var  m            = 4;

            for (var k = 0; k < m; k++)
            {
                var items = new List <XDoc>();
                for (var i = 0; i < n; i++)
                {
                    items.Add(new XDoc("test")
                              .Attr("id", i)
                              .Elem("foo", "bar")
                              .Start("baz")
                              .Attr("meta", "true")
                              .Value("dsfdsssssssssssssssssssssssssssssfdfsfsfsfsfsfsfd")
                              .End()
                              .Start("id", StringUtil.CreateAlphaNumericKey(16)));
                }
                var stopwatch = Stopwatch.StartNew();
                foreach (var itm in items)
                {
                    queue.Enqueue(itm);
                }
                Assert.AreEqual(n, queue.Count);
                stopwatch.Stop();
                totalEnqueue += stopwatch.ElapsedMilliseconds;
                var j = 0;
                stopwatch = Stopwatch.StartNew();
                var v = queue.Dequeue();
                while (v != null)
                {
                    Assert.IsTrue(queue.CommitDequeue(v.Id));
                    j++;
                    v = queue.Dequeue();
                }
                stopwatch.Stop();
                totalDequeue += stopwatch.ElapsedMilliseconds;
                Assert.AreEqual(n, j);
                Assert.AreEqual(0, queue.Count);
            }
            Console.WriteLine("Enqueue: {0:0,000}/s", n * m * 1000 / totalEnqueue);
            Console.WriteLine("Dequeue: {0:0,000}/s", n * m * 1000 / totalDequeue);
        }
Exemple #2
0
 private void CheckExpire(TaskTimer timer)
 {
     while (true)
     {
         // get the next scheduled item
         UpdateRecord data = null;
         lock (_data) {
             if (_queue.Count == 0)
             {
                 _queueTimer.Change(_delay, TaskEnv.None);
                 return;
             }
             Tuplet <DateTime, XUri> key = _queue.Peek();
             if (key.Item1 > DateTime.UtcNow)
             {
                 _queueTimer.Change(key.Item1, TaskEnv.None);
                 return;
             }
             data = _data[key.Item2];
             _queue.Dequeue();
             _data.Remove(key.Item2);
         }
         Interlocked.Increment(ref _pendingCount);
         _dispatcher.Dispatch(data, new Result(TimeSpan.MaxValue)).WhenDone(r => {
             // cleanup items from the queue
             var poll = false;
             foreach (var itemId in data.QueueIds)
             {
                 if (!_persistentQueue.CommitDequeue(itemId))
                 {
                     // if we couldn't take an item, it must have gone back to the queue, so we better poll again
                     poll = true;
                 }
             }
             if (poll)
             {
                 _poll = true;
             }
             Interlocked.Decrement(ref _pendingCount);
             if (r.HasException)
             {
                 _log.Error(string.Format("dispatch of '{0}' encountered an error", data.Id), r.Exception);
             }
         });
     }
 }
Exemple #3
0
        private int Dequeue(ITransactionalQueue <XDoc> queue, ManualResetEvent trigger)
        {
            trigger.WaitOne();
            var j = 0;
            ITransactionalQueueEntry <XDoc> value = queue.Dequeue();

            while (value != null)
            {
                bool success = queue.CommitDequeue(value.Id);
                if (!success)
                {
                    throw new InvalidOperationException();
                }
                j++;
                value = queue.Dequeue();
            }
            return(j);
        }
Exemple #4
0
        private void Perf_test_single_thread_put_peek_and_take(ITransactionalQueue<XDoc> queue)
        {
            long totalEnqueue = 0;
            long totalDequeue = 0;
            var n = 20000;
            var m = 4;

            for(var k = 0; k < m; k++) {
                var items = new List<XDoc>();
                for(var i = 0; i < n; i++) {
                    items.Add(new XDoc("test")
                                  .Attr("id", i)
                                  .Elem("foo", "bar")
                                  .Start("baz")
                                  .Attr("meta", "true")
                                  .Value("dsfdsssssssssssssssssssssssssssssfdfsfsfsfsfsfsfd")
                                  .End()
                                  .Start("id", StringUtil.CreateAlphaNumericKey(16)));
                }
                var stopwatch = Stopwatch.StartNew();
                foreach(var itm in items) {
                    queue.Enqueue(itm);
                }
                Assert.AreEqual(n, queue.Count);
                stopwatch.Stop();
                totalEnqueue += stopwatch.ElapsedMilliseconds;
                var j = 0;
                stopwatch = Stopwatch.StartNew();
                var v = queue.Dequeue();
                while(v != null) {
                    Assert.IsTrue(queue.CommitDequeue(v.Id));
                    j++;
                    v = queue.Dequeue();
                }
                stopwatch.Stop();
                totalDequeue += stopwatch.ElapsedMilliseconds;
                Assert.AreEqual(n, j);
                Assert.AreEqual(0, queue.Count);
            }
            Console.WriteLine("Enqueue: {0:0,000}/s", n * m * 1000 / totalEnqueue);
            Console.WriteLine("Dequeue: {0:0,000}/s", n * m * 1000 / totalDequeue);
        }
Exemple #5
0
 private int Dequeue(ITransactionalQueue<XDoc> queue, ManualResetEvent trigger)
 {
     trigger.WaitOne();
     var j = 0;
     ITransactionalQueueEntry<XDoc> value = queue.Dequeue();
     while(value != null) {
         bool success = queue.CommitDequeue(value.Id);
         if(!success) {
             throw new InvalidOperationException();
         }
         j++;
         value = queue.Dequeue();
     }
     return j;
 }