snisn 2019-08-31 01:19 采纳率: 100%
浏览 400
已采纳

C#如何排查这条if语句运行时间过长的问题?

大家好!为了缩短运算时间,我通过Stopwatch类记录了几个关键步骤的运行时间,代码是这样的:

首先,以下3个变量是本次提问会用到的:

//定义的部分
Dictionary<string, node> AllNodes = new Dictionary<string, node>();
Dictionary<string, node> CloseList = new Dictionary<string, node>();
string nextCheckingId;

然后,以下是代码V1

while(条件省略)
{
    //省略无关代码

    watch1.Start();//watch1是1个Stopwatch的对象,下同

    if (!AllNodes.ContainsKey(nextCheckingId) || CloseList.ContainsKey(nextCheckingId))
    {
        continue;
    }

    watch1.Stop();

    //省略无关代码
}

//运行后输出watch1,经多次测算:
//  watch1=73ms

为了缩短这一段的时延,想看看哪一句耗时多,于是改成了以下代码V2

while(条件省略)
{
    //省略无关代码

    watch1.Start();

    watch1_1.Start();
    bool b1 = AllNodes.ContainsKey(nextCheckingId);
    watch1_1.Stop();

    watch1_2.Start();
    bool b2 = CloseList.ContainsKey(nextCheckingId);
    watch1_2.Stop();

    watch1_3.Start();
    if (!b1 || b2) continue;
    watch1_3.Stop();

    watch1.Stop();

    //省略无关代码
}

//运行后输出以上几个watch,经多次测算:
//  watch1=80ms
//  watch1_1=5ms
//  watch1_2=4ms
//  watch1_3=71ms

我想请问,为何if(!b1 || b2)这句会占用这么多的时间?是否我的测算方法有误?怎样才能尽量缩短这一段的运行时长呢?感谢~

(C币余额不足,无法发布悬赏了,抱歉)

  • 写回答

1条回答 默认 最新

  • Tiarnach 2019-08-31 13:37
    关注

    你的测算方法有误,!b1||b2 为真时,应该把watch1_3停用再continue,你直接continue了,一直在计时,时间肯定要长

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名