代码之家  ›  专栏  ›  技术社区  ›  Jab

if、case和while语句之间的区别是什么

  •  2
  • Jab  · 技术社区  · 15 年前

    我只想知道Objective-C中所有条件语句之间的区别,以及哪一个语句更快更轻。

    10 回复  |  直到 15 年前
        1
  •  5
  •   paxdiablo    15 年前

    语言不可知论版本(很明显,这不包括声明性语言或其他奇怪的语言):

    什么时候? 它是一种由三种执行指令的方式组成的语言(很长一段时间以前,我可以自由承认)。

    • 顺序(按顺序做事)。
    • 选择(做很多事情之一)。
    • 迭代(做一些零次或更多次的事情)。

    这个 if case 语句都是所选内容的变体。 If 用于根据条件(使用伪代码)选择两个不同选项之一:

    if condition:
        do option 1
    else:
        do option 2
    

    记住 else 可能不需要,在这种情况下,它是有效的 else do nothing . 还请记住,选项1或2也可能包含任何语句类型,包括 如果 语句(称为嵌套)。

    Case 稍有不同-通常指两个以上的选择,比如当你想根据一个角色做不同的事情时:

    select ch:
        case 'a','e','i','o','u':
            print "is a vowel"
        case 'y':
            print "never quite sure"
        default:
            print "is a consonant"
    

    请注意,您可以使用 案例 有两种选择(甚至一种),但这有点像用热核弹头杀死一只苍蝇。

    While 不是选择变量,而是迭代变量。它属于类似的 for ,请 repeat , until 还有很多其他的可能性。

    至于哪个速度最快,在 巨大的 大多数情况下。编译器作者比凡人更了解如何从代码中获得最后一点性能。您要么信任他们正确地完成他们的工作,要么自己在汇编中手工编码(我更喜欢前者)。

    通过集中于宏视图而不是小的东西,您将获得更高的性能。这包括选择适当的算法、分析和热点定位。每个月花五分钟的时间,在两分钟内完成这项任务,这样做没有什么好处。最好是在每一分钟发生的事情上取得较小的改进。

    语言结构如下 如果 , while ,请 案例 因为它们被大量使用并且相对简单,所以它们已经尽可能快了。您应该首先编写代码以提高可读性,并且只在性能成为问题时才担心性能(请参阅yagni)。

    即使你发现 if/goto 组合而不是 案例 如果允许你运行得更快一点,那么导致的源代码的混乱将很难维持下去。

        2
  •  13
  •   Ned Batchelder    15 年前

    一条建议是:不要担心哪种语言的结构在微观上比其他语言快或慢,而应该关注哪种语言能让你最好地表达自己。

        3
  •  9
  •   Drew Dormann    15 年前

    If and case statements 描述

    While statement 描述

    因为这些陈述有不同的作用,所以辩论哪一个更快是徒劳的。

    就像问锤子是否比螺丝刀快。

        4
  •  1
  •   sepp2k    15 年前

    虽然不是条件,但它是循环。区别在于while循环的主体可以执行多次,条件的主体只能执行一次或根本不执行。

    if和switch之间的区别在于if接受任意表达式作为条件,switch只取值进行比较。基本上,如果你有一个像 if(x==0) {} else if(x==1) {} else if(x==2) ... 使用switch可以更简洁(有效)地编写它。

        5
  •  1
  •   Tim Keating    15 年前

    案例陈述可以写为

    if (a)
    {
        // Do something
    }
    else if (b)
    {
        // Do something else
    }
    

    但是这种情况更有效,因为它只对条件进行一次评估,然后再对分支进行评估。

    while 仅当需要多次计算条件并执行关联的代码块时才有用。如果您期望一个条件只发生一次,那么它等于 if . 更恰当的比较是 虽然 是更广义的 for .

        6
  •  1
  •   FloppyDisk    15 年前

    每个条件语句都有不同的用途,您不会在每个情况下使用相同的条件语句。学习哪一个适合哪种情况,然后编写代码。如果您分析您的代码并发现有一个瓶颈,那么您可以继续并解决它。在实际出现问题之前不要担心优化。

        7
  •  1
  •   BP.    15 年前

    您在问一个if结构是否比一个大型循环内的switch语句执行得更快?如果是这样的话,我做了一个快速测试,这个代码被放入了我刚刚在最新的Xcode和iPhone SDK中创建的一个基于视图的新项目的viewdidLoad方法中:

    NSLog(@"Begin loop");
    NSDate *loopBegin = [NSDate date];
    
    int ctr0, ctr1, ctr2, ctr3, moddedNumber;
    ctr0 = 0;
    ctr1 = 0;
    ctr2 = 0;
    ctr3 = 0;
    for (int i = 0; i < 10000000; i++) {
        moddedNumber = i % 4;
    
        // 3.34, 1.23s in simulator
        if (moddedNumber == 0)
        {
            ctr0++;
        }
        else if (moddedNumber == 1)
        {
            ctr1++;
        }
        else if (moddedNumber == 2)
        {
            ctr2++;
        }
        else if (moddedNumber == 3)
        {
            ctr3++;
        }
    
        // 4.11, 1.34s on iPod Touch
        /*switch (moddedNumber)
        {
            case 0:
                ctr0++;
                break;
            case 1:
                ctr1++;
                break;
            case 2:
                ctr2++;
                break;
            case 3:
                ctr3++;
                break;
        }*/
    }
    
    NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:loopBegin];
    
    NSLog(@"End loop: %f seconds", elapsed );
    

    这段代码示例决不是完整的,因为正如前面指出的那样,如果出现的情况比其他情况要多,那么您当然需要将这段代码放在前面,以减少比较的总数。它确实表明,如果在决策或多或少在分支之间平均分配的情况下,if结构的执行速度会更快一些。

    另外,请记住,在设备上运行测试与在模拟器上运行测试之间,这个小测试的结果在性能上有很大差异。代码注释中引用的时间在实际设备上运行。(第一次显示的时间是第一次运行代码时运行循环的时间,第二次显示的时间是在不重新生成的情况下再次运行同一代码时的时间。)

        8
  •  0
  •   HostileFork says dont trust SE    15 年前

    conditional statements conditional loops . (如果要信任维基百科,那么在编程中简单地引用“条件”并不包括条件循环。但这只是一个小的术语问题。)

    Shmoopty说,“由于这些声明有不同的作用,所以讨论哪个更快是毫无意义的。”

    好。。。可能花的时间不多,但不是 荒谬的 . 例如,假设你有一个 if 声明:

    if (cond) {
        code
    }
    

    您可以将其转换为最多执行一次的循环:

    while (cond) {
        code
        break;
    }
    

    后者在几乎任何语言中都会变慢(或速度相同,因为优化器将其转换回原始语言 如果 在幕后!)然而,在计算机编程中也有这样的情况(由于奇怪的情况) 复杂的东西跑得更快

    但这些事件很少发生。重点应该放在你的代码上——是什么让代码最清晰,以及什么捕获了你的意图。

        9
  •  -1
  •   Hassan Syed    15 年前

    循环和分支很难简单地解释,要从任何C样式语言的构造中获得最佳代码,取决于所使用的处理器和代码的本地上下文。主要目标是减少执行管道的中断——主要是通过减少分支预测失误。

    我建议你 go here 满足所有优化需求。这些手册是为C样式的程序员编写的,如果您知道一些汇编,则相对容易理解。这些手册应该向您解释现代处理器中的微妙之处,顶级编译器使用的策略,以及构造代码以充分利用它的最佳方法。

        10
  •  -4
  •   Hassan Syed    15 年前

    我只记得 关于条件和分支代码最重要的事情 .按如下顺序订购代码

    if(x==1); //80% of the time
    else if(x==2); // 10% of the time
    else if(x==3); //6% of the time
    else break;
    

    您必须使用其他序列…在这种情况下,CPU中的预测逻辑将正确预测 x==1 并避免80%的执行中断管道。

    More information 来自英特尔。尤其:

    为了有效地编写代码以利用这些规则,在编写if else或switch语句时,首先检查最常见的情况,然后逐步向下到最不常见的情况。循环不一定需要任何特殊的代码顺序来进行静态分支预测,因为通常只使用循环迭代器的条件。

    按照这个规则,你是 给出CPU提示 关于如何将其预测逻辑偏向于链接的条件。

    推荐文章