Joh*_*ock 132 javascript conditional cross-browser
伙计们我有几个问题:
switch语句与JavaScript之间是否存在性能差异if...else? switch和if...else不同之处是什么?(FireFox,IE,Chrome,Opera,Safari)提出这个问题的原因似乎是我switch在Firefox中的大约1000个案例的声明中获得了更好的表现.
编辑 不幸的是,这不是我的代码,Javascript正在从编译库生成服务器,我无法访问代码.调用生成javascript的方法
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
Run Code Online (Sandbox Code Playgroud)
note arrayofvalues是逗号分隔的列表.
它产生的是什么
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Run Code Online (Sandbox Code Playgroud)
注意:where [name]=传递给serverside函数的名称
现在我将要插入的函数的输出更改为TextArea,编写了一些JavaScript代码来解析函数,并将其转换为一组case语句.
最后我运行该功能,它运行良好但IE和Firefox的性能不同.
Tom*_*mmy 106
回答一般性问题:
Poi*_*nty 59
有时最好不要使用它.例如,在"调度"情况下,Javascript允许您以完全不同的方式执行操作:
function dispatch(funCode) {
var map = {
'explode': function() {
prepExplosive();
if (flammable()) issueWarning();
doExplode();
},
'hibernate': function() {
if (status() == 'sleeping') return;
// ... I can't keep making this stuff up
},
// ...
};
var thisFun = map[funCode];
if (thisFun) thisFun();
}
Run Code Online (Sandbox Code Playgroud)
通过创建对象来设置多向分支具有很多优点.您可以动态添加和删除功能.您可以从数据创建调度表.您可以通过编程方式检查它.您可以使用其他功能构建处理程序.
有一个函数调用的额外开销来获得等效的"case",但是哈希查找的优势(当有很多情况时)找到特定键的函数.
Guf*_*ffa 17
a switch和a之间的性能差异if...else if...else很小,它们基本上做同样的工作.它们之间可能有所不同的一个区别是,要测试的表达式仅在一段switch时间内被评估,每次评估它if.如果评估表达式的成本很高,那么一次这样做当然比做一百次更快.
这些命令(以及一般所有脚本)的实现差异在浏览器之间有很大差异.在不同的浏览器中看到相同代码的相当大的性能差异是很常见的.
由于您几乎无法在所有浏览器中对所有代码进行性能测试,因此您应该选择最适合您所做工作的代码,并尝试减少完成的工作量而不是优化工作方式.
Pointy 的回答建议使用对象文字作为switchor if/的替代else。我也喜欢这种方法,但是map每次dispatch调用该函数时,答案中的代码都会创建一个新对象:
function dispatch(funCode) {
var map = {
'explode': function() {
prepExplosive();
if (flammable()) issueWarning();
doExplode();
},
'hibernate': function() {
if (status() == 'sleeping') return;
// ... I can't keep making this stuff up
},
// ...
};
var thisFun = map[funCode];
if (thisFun) thisFun();
}
Run Code Online (Sandbox Code Playgroud)
如果map包含大量条目,这会产生大量开销。最好只设置一次动作地图,然后每次都使用已经创建的地图,例如:
var actions = {
'explode': function() {
prepExplosive();
if( flammable() ) issueWarning();
doExplode();
},
'hibernate': function() {
if( status() == 'sleeping' ) return;
// ... I can't keep making this stuff up
},
// ...
};
function dispatch( name ) {
var action = actions[name];
if( action ) action();
}
Run Code Online (Sandbox Code Playgroud)
基本上,使用任何使代码最具可读性的东西.肯定有一个或另一个结构使得更清晰,更易读和更易于维护的地方.这远比在JavaScript代码中节省几纳秒更重要.
除了语法之外,可以使用树来实现切换O(log n),而if/else必须使用O(n)过程方法来实现.更常见的是,它们都是在程序上处理的,唯一的区别是语法,而且它真的很重要 - 除非你静态输入10k if/else案例吗?
| 归档时间: |
|
| 查看次数: |
98106 次 |
| 最近记录: |