最快的方式来执行此操作?三元运算符?开关?阵列?

时间:2011-09-12 00:30:29

标签: javascript performance optimization if-statement ternary-operator

执行此操作的最快方法是什么?左侧的parens中的变量返回布尔值,它们表示窗口大小范围。 (例如o1281为屏幕1281及更高版本返回trueo1025为1025及更高版本返回true等等。)

markup = // ternary triangle (the rows set the markup priority at each band)
    ( o1281 ) ? r1281 || r1025 || r961 || r641 || r481 || r320 || r0 || omarkup: 
        ( o1025 ) ? r1025 || r961 || r641 || r481 || r320 || r0 || omarkup: 
            ( o961 ) ? r961 || r641 || r481 || r320 || r0 || omarkup: 
                ( o641 ) ? r641 || r481 || r320 || r0 || omarkup: 
                    ( o481 ) ? r481 || r320 || r0 || omarkup: 
                        ( o320 ) ? r320 || r0 || omarkup: 
                            ( o0 ) ? r0 || omarkup: 
                                omarkup;

我想可能会根据中间(o641)条件将其分为2个范围。

值得吗?

1 个答案:

答案 0 :(得分:2)

好的,你正在做的是寻找第一个按降序排列的真值o值,一旦你找到一个你正在寻找第一个真正的r值,其名称为<=这个o值。找不到,您希望返回值omarkup

因为您只有几个o值和r值,所以您的代码尽可能“有趣”,似乎可以使测试次数最少。

我无法看到开关或散列是如何帮助的,因为你看起来似乎是按降序搜索第一个真值......因此,我不明白为什么分裂也有助于提高性能。保持原样,或者,如果您更喜欢可读性(正如许多程序员所做的那样),请制作1281,1025等字段的对象。

此外,担心性能通常是在面对将要执行许多次的操作时所做的事情。这是这种情况吗?假设o和r值不变,这看起来像你只会执行一次。 (仅供参考。)

<强>附录

根据添加到上述问题的评论,它看起来像 喜欢多次执行的操作。在这种情况下,尽管现代编译器非常好,但在JavaScript级别进行自我优化可能还可以。从代码审查角度来看,最大的问题是1281,1025,961,941等值是手动布局的,并且是源代码的一部分,因此维护,例如在此处添加新的大小值,好吧,棘手且容易出错。也就是说,根据您所展示的内容,我认为可以肯定地说,如果编写的JavaScript是最好的,那么编写的JavaScript是最好的。您始终可以针对实际定义这些值的实现进行一次拍摄,然后对其进行分析以查看它是否“足够快”。例如,您可以定义一个数组,例如

var sizes = [1281,1025,961,641,481,320,0] 

并循环,但是,这样的实现存在开销。

可能对您有所帮助的一个问题是仔细考虑可以缓存和不缓存的内容。这有助于加快将来执行此代码的速度。