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); }
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); } }); } }
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); }
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); }
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; }