ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-使用观察值测量响应时间

2019-11-11 05:05:38  阅读:236  来源: 互联网

标签:system-reactive reactive-programming c


给定Observable A代表传入的请求…

interface IRequest
{
  string Id { get; }
}

IObservable<IRequest> requests;

和代表响应的可观察B …

IObservable<string> responses;

我需要测量产生响应所需的时间.我当前的解决方案如下所示.这行得通,但我不确定是否可以简化或更简化.我还担心实际响应时间([GEN])和观察到的响应时间([OBS])之间的偏差,如果将generateResponseTime设置为sub 50ms,该偏差将变得非常小.

class Program
{
    public class Request
    {
        public string Id { get; set; }
    }

    static void Main(string[] args)
    {
        var generatedResponseTime = 100;

        var responseSub = new Subject<string>();

        IObservable<Request> requests = Observable.Interval(TimeSpan.FromMilliseconds(1000))
            .Select(x=> new Request { Id = x.ToString("d") });

        IObservable<string> responses = responseSub.AsObservable();

        var responseTime = requests
            .Where(x => !string.IsNullOrEmpty(x.Id))
            .Select(req => new { Id = req.Id, Start = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() })
            .SelectMany(req => responses
                .Where(reqId => reqId == req.Id)
                .Select(_ => new { RequestId = req.Id, ResponseTime = (int)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - req.Start) })
                .Take(1))
            .Publish()
            .RefCount();

        requests.ObserveOn(TaskPoolScheduler.Default)
            .Subscribe(req =>
            {
                Console.WriteLine($"[GEN] {req.Id} = {generatedResponseTime} ms");

                Thread.Sleep(generatedResponseTime);
                responseSub.OnNext(req.Id);
            });

        responseTime.Subscribe(x => Console.WriteLine($"[OBS] {x.RequestId} = {x.ResponseTime} ms"));

        Console.ReadLine();
    }
}

解决方法:

这是使用一些内置运算符的替代方法.您的解决方案中也没有多个订阅问题:

var responseTime2 = requests
    .Timestamp()
    .Join(responses.Timestamp(),
        request => Observable.Never<Unit>(), //timeout criteria
        response => Observable.Empty<Unit>(),
        (request, response) => (request: request, response: response)
    )
    .Where(t => t.request.Value.Id == t.response.Value)
    .Select(t => t.response.Timestamp.ToUnixTimeMilliseconds() - t.request.Timestamp.ToUnixTimeMilliseconds())

如果您对请求有任何超时条件,那么从性能的角度来看,将注释放在注释中将很有帮助.否则,Join / Where组合的性能会随着时间的流逝而恶化.

标签:system-reactive,reactive-programming,c
来源: https://codeday.me/bug/20191111/2017750.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有