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 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退