1:
      if lngA>lngB then
         lngC=lngA-lngB
      else
         lngC=0
      end if
   
   2:
     lngC=0
     if lngA>lngB then
         lngC=lngA-lngB
     end if
   哪位能告诉我,一个if分支的花费和一个简单类型的赋值语句的花费分别是多少?第一种情况,编译器会如何处理?

解决方案 »

  1.   

       2: 
         lngC=0 
         if lngA> lngB then 
             lngC=lngA-lngB 
         end if 
    这样比较合理
      

  2.   


    lngC = Iif(lngA > lngB, lngA - lngB, 0)
    这样更好
      

  3.   

    lngC=0 
    if lngA> lngB then lngC=lngA-lngB 
      

  4.   

    绝对是第一种.第一种的操作:一次比较,一次赋值.第二种的操作:一次赋值,一次比较,可能的又一次赋值.哪种更优,一看就明白了.另外,程序中的赋值,总是比诸如比较,运算等操作要花多得多的时间.因为赋值涉及到外存储器,要用到外部总线.而比较只是用到CPU中的寄存器,只用内部总线,外部总线访问时等待的时间片要比内部总线多到不知哪儿去了.所以,如果要考虑运算速度的话,能不赋值的地方,尽量不赋值.如果各位写过判断一个很大的数是否为素数之类很花时间的程序,就应该体会到了.
      

  5.   

    我喜欢用
    lngC = iif(lngA > lngB, lngA - lngB, 0)
    简单明了。
      

  6.   

    呵呵, 同楼上的, 代码也简洁多了容易Debug 纠错
      

  7.   

    有时候单独用LNGC=0是有必要的,比如LNGC是一个循环变量,在循环之前必须初始化,
    讨论这两种性能,没必要。
      

  8.   

    最好不要用iif,因为即使返回第一个返回值时,两个返回值都要进行计算的.
      

  9.   

    估且不讲效率初学者: 99.999%是if lngA>lngB then 
       lngC=lngA-lngB 
    else 
       lngC=0 
    end if 
      

  10.   


    两个变量比较大小的系统消耗和两个变量的减法差不多。进行了一次比较之后再进行运算,这样进行了两次运算。
    我的想法是lngC=lngA-lngB
    if lngC<0 then lngC=0一次减法运算反正是不可避免的。变量与0的比较只需要判定最高位,记得CPU 的FLAGS寄存器中有一位是专门标志EAX寄存器重最高位的。还有一条专门的跳转指令与之对应只需要一个cpu周期,所以如果编译器优化得好的话我的算法应该比楼主的那两种方式效率都高那么一点点。
    汇编的东西都忘光了,如果说得不对不要责怪
      

  11.   

    赞同第2种
     2: 
         lngC=0 
         if lngA>lngB then 
             lngC=lngA-lngB 
         end if