亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

切換語句大于/小于

切換語句大于/小于

偶然的你 2019-08-24 14:58:58
切換語句大于/小于所以我想使用這樣的開關語句:switch (scrollLeft) {   case (<1000):    //do stuff    break;   case (>1000 && <2000):    //do stuff    break;}現在我知道這些語句(<1000)或(>1000 && <2000)中的任何一個都不起作用(顯然有不同的原因)。我要問的是最有效的方法。我討厭使用30個if語句,所以我寧愿使用switch語法。有什么我可以做的嗎?
查看完整描述

3 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

當我在其他答案中查看解決方案時,我看到一些我知道對性能有害的事情。我打算將它們放在評論中,但我認為最好對它進行基準測試并分享結果。你可以自己測試一下。下面是我的結果(ymmv)在每個瀏覽器中最快的操作之后歸一化(將1.0時間乘以標準化值以獲得以ms為單位的絕對時間)。

                    Chrome Firefox Opera MSIE Safari節點-------------------------------------------------- -----------------1.0次37ms 73ms 68ms 184ms 73ms 21msif-immediate 1.0 1.0 1.0 2.6 1.0 1.0if-indirect 1.2 1.8 3.3 3.8 2.6 1.0switch-immediate 2.0 1.1 2.0 1.0 2.8 1.3開關范圍38.1 10.6 2.6 7.3 20.9 10.4switch-range2 31.9 8.3 2.0 4.5 9.5 6.9switch-indirect-array 35.2 9.6 4.2 5.5 10.7 8.6array-linear-switch 3.6 4.1 4.5 10.0 4.7 2.7array-binary-switch 7.8 6.7 9.5 16.0 15.0 4.9

使用以下版本測試在Windows 7 32位上執行的操作:Chrome 21.0.1180.89m,Firefox 15.0,Opera 12.02,MSIE 9.0.8112Safari 5.1.7。節點在Linux 64位盒上運行,因為Node.js for Windows上的計時器分辨率是10ms而不是1ms。

如果,即時

這是所有測試環境中最快的,除了...... 鼓樂 MSIE!(驚訝,驚訝)。這是實現它的推薦方法。

if (val < 1000) { /*do something */ } elseif (val < 2000) { /*do something */ } else...if (val < 30000) { /*do something */ } else

如果間接

這是一種變體,switch-indirect-array但使用if-statements代替,并且比switch-indirect-array幾乎所有測試環境都要快得多。

values=[
   1000,  2000, ... 30000];if (val < values[0]) { /* do something */ } elseif (val < values[1]) { /* do something */ } else...if (val < values[29]) { /* do something */ } else

開關,立即

這在所有測試環境中都非常快,實際上是MSIE中最快的。它可以在您進行計算以獲取索引時起作用。

switch (Math.floor(val/1000)) {
  case 0: /* do something */ break;
  case 1: /* do something */ break;
  ...
  case 29: /* do something */ break;}

開關范圍

這比所有測試環境中最快的速度慢6到40倍,除了Opera需要大約1.5倍的時間。它很慢,因為引擎必須為每種情況比較兩次值。令人驚訝的是,與Chrome中最快的操作相比,Chrome完成此操作所需的時間要長近40倍,而MSIE只需要6倍的時間。但實際時差僅為74毫秒,有利于MSIE為1337毫秒(?。?。

switch (true) {
  case (0 <= val &&  val < 1000): /* do something */ break;
  case (1000 <= val &&  val < 2000): /* do something */ break;
  ...
  case (29000 <= val &&  val < 30000): /* do something */ break;}

開關范圍2

這是一個變體,switch-range但每個案例只有一個比較因此更快,但除了Opera之外仍然非常慢。case語句的順序很重要,因為引擎將以源代碼順序ECMAScript262:5 12.11測試每個案例

switch (true) {
  case (val < 1000): /* do something */ break;
  case (val < 2000): /* do something */ break;
  ...
  case (val < 30000): /* do something */ break;}

切換-間接陣列

在該變體中,范圍存儲在陣列中。這在所有測試環境中都很慢,而在Chrome中則非常慢。

values=[1000,  2000 ... 29000, 30000];switch(true) {
  case (val < values[0]): /* do something */ break;
  case (val < values[1]): /* do something */ break;
  ...
  case (val < values[29]): /* do something */ break;}

陣列線性搜索

這是對數組中值的線性搜索和具有固定值的switch語句的組合。人們可能想要使用它的原因是直到運行時才知道這些值。在每個測試環境中都很慢,在MSIE中需要幾乎10倍的時間。

values=[1000,  2000 ... 29000, 30000];for (sidx=0, slen=values.length; sidx < slen; ++sidx) {
  if (val < values[sidx]) break;}switch (sidx) {
  case 0: /* do something */ break;
  case 1: /* do something */ break;
  ...
  case 29: /* do something */ break;}

陣列二進制開關

這是array-linear-switch二進制搜索的變體。不幸的是它比線性搜索慢。我不知道這是我的實現還是線性搜索更優化。它也可能是鍵空間很小。

values=[0, 1000,  2000 ... 29000, 30000];while(range) {
  range = Math.floor( (smax - smin) / 2 );
  sidx = smin + range;
  if ( val < values[sidx] ) { smax = sidx; } else { smin = sidx; }}switch (sidx) {
  case 0: /* do something */ break;
  ...
  case 29: /* do something */ break;}

結論

如果性能很重要,請使用if-statements或switch使用立即值。


查看完整回答
反對 回復 2019-08-24
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

switch (Math.floor(scrollLeft/1000)) {
  case 0: // (<1000)
   //do stuff
   break;
  case 1: // (>=1000 && <2000)
   //do stuff;
   break;}

只有經常步驟才有效...


查看完整回答
反對 回復 2019-08-24
?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

我討厭使用30 if語句

我最近有同樣的情況,這就是我解決它的方式:

之前:

if(wind_speed >= 18) {
    scale = 5;} else if(wind_speed >= 12) {
    scale = 4;} else if(wind_speed >= 9) {
    scale = 3;} else if(wind_speed >= 6) {
    scale = 2;} else if(wind_speed >= 4) {
    scale = 1;}

后:

var scales = [[4, 1], [6, 2], [9, 3], [12, 4], [18, 5]];scales.forEach(function(el){if(wind_speed > el[0]) scale = el[1]});

如果你設置“1,2,3,4,5”,那么它可以更簡單:

var scales = [4, 6, 9, 12, 18];scales.forEach(function(el){if(wind_speed >= el) scale++});


查看完整回答
反對 回復 2019-08-24
  • 3 回答
  • 0 關注
  • 621 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號