是否有可能避免在条件中出现许多 "或"(||)造成相同的动作? - 页 2

 
TarasBY:

你也可以通过这种方式来优化计算。

谢谢!有人已经建议我使用bool Avals,Vinin警告我说这将严重减慢速度。而在我几乎完成了一个EA之后,我正在寻找其他的东西来优化代码。我已经成功地将12个月内所有测试器的运行时间从40分钟减少到13分钟!这就是我的工作。
 

有人说过很多次:MCL中没有捷径,如果(a||b||c||d||e){}所有条件都会被检查。

出路是筑巢的条件。

if(a){if(b){if(c){}},在这种情况下,退出将发生在第一个匹配条件上。

但嵌套也不是无限的,最灵活的解决方案是在一个有退出的循环中检查条件。

bool cond[]={a,b,c,d,e,...};
int sz = ArraySize(cond);
for(int i=0;i<sz;i++){
   if(cond[i]){
      bla.bla.bla;
      break;
   }
}
 
Vinin: 你可以,但速度会下降很多。
Victor,你的警告(关于使用bool变量)是否适用于我的优化选项?
 
FAQ:

有人说过很多次:MCL中没有捷径,如果(a||b||c||d||e){}所有条件都会被检查。

出路是筑巢的条件。

if(a){if(b){if(c){}},在这种情况下,退出将发生在第一个匹配条件上。

但嵌套也不是无限的,最灵活的解决方案是在一个有退出的循环中检查条件。

非常感谢您!我将试一试!你懂西班牙语吗?因为 "bla, bla, bla "来自于动词 "说话"(hablar)!
 
没有,但我很擅长奥尔班:))
 
FAQ:
没有,但我很了解奥尔巴尼安:))

嵌套条件if(a){if(b){if(c){}}是不好的,因为所有的条件都是互斥的,但有些东西对布尔值不起作用。可能也很有可能是我做错了什么。到目前为止,我已经停止了为每个条件制作一个双倍变量,并将其粘贴到带有4个 "或 "的同一个if()中。如我所料,这并没有影响到测试的速度。在12个月内,所有蜱虫都是同样的13分钟。

或者说这种语言被称为奥布兰斯基

 
borilunad:

嵌套条件if(a){if(b){if(c){}}是不好的,因为所有条件都是互斥的。可能也很有可能做错了什么。


一切都很好,只要记住布尔运算中的一些特性,例如:a || b = !( !a && !b )。那么,通过从连合到分离,我们可以用连续(嵌套)的AND条件检查来取代OR条件的检查:例如,如果(a || b || c)变成,正如TarasBY在上面正确写的那样,变成

bool M = true;

if(!a) {if(!b) {if(!c) M=false;}}

if(!M) {Action;}

一般来说,这段代码比带有||的原始代码快,因为它只执行到列表中的一个条件为真,即直到整个OR操作的结果为TRU。

 
alsu:

一切都很好,只要记住布尔运算中的一些特性,例如:a || b = !( !a && !b )。那么,通过从连合到分离,我们可以用连续(嵌套)的AND条件检查来代替OR条件的检查:例如,如果(a || b || c)变成,正如TarasBY在上面正确写的那样,变成

一般来说,这段代码比带有||的原始代码快,因为它只执行到列表中的一个条件为真,即直到整个OR操作产生一个TRU结果。

我们也可以加速,例如,如果我们知道条件A平均比C更经常被执行,而C比B更经常被执行,那么我们应该把它们按这个顺序排列:if(!a){if(!c)if{(!b) M=false;}}。
 
alsu:

一切都很好,只要记住布尔运算中的一些特性,例如:a || b = !( !a && !b )。那么,通过从连合到分离,我们可以用连续(嵌套)的AND条件检查来代替OR条件的检查:例如,如果(a || b || c)变成,正如TarasBY在上面正确写的那样,变成

一般来说,这段代码比带有||的原始代码快,因为它只执行到列表中的一个条件为真,即直到整个OR操作产生一个TRU结果。

感谢你的参与!我有5个不同但价值相等的条件,如果没有条件为真,EA会等待,直到其中一个条件为真。因此,尽管我作出了努力,但没有一种实施形式被证明是更好的。因此,我将暂时坚持使用我的 "馅饼"。
 
borilunad:
感谢你的参与!我有5个不同但相等的条件,如果不满足任何条件,EA会等待其中一个条件的满足。因此,尽管我做出了努力,但没有任何一种实施形式被证明是更好的。因此,我将暂时坚持使用我的 "馅饼"。
甚至我刚才给你看的东西?那么,就应该通过其他方式来提高性能。