我正在尝试使程序的这一部分更有效地运行,并且我不确定最好的方法是优化此代码块以使其更快
系统的输入范围是1到-1(很敏感,我需要详细信息)。我正在尝试计算称为yaw_cmd_v
(偏航命令电压)的输出
//Here we try to put force values based on rudder deflection but divided into many parts to reduce noise and prevent suddend onset of force
if (rudderValueForce >= 0 && rudderValueForce <= 0.05) { yaw_CMND_V = -rudderValueForce * 0; }
if (rudderValueForce >= 0.05 && rudderValueForce <= 0.1) { yaw_CMND_V = -rudderValueForce * 5; }
if (rudderValueForce >= 0.1 && rudderValueForce <= 0.15) { yaw_CMND_V = -rudderValueForce * 10; }
if (rudderValueForce >= 0.15 && rudderValueForce <= 0.2) { yaw_CMND_V = -rudderValueForce * 15; }
if (rudderValueForce >= 0.2 && rudderValueForce <= 0.25) { yaw_CMND_V = -rudderValueForce * 20; }
if (rudderValueForce >= 0.25 && rudderValueForce <= 0.3) { yaw_CMND_V = -rudderValueForce * 25; }
if (rudderValueForce > 0.3 && rudderValueForce <= 0.5) { yaw_CMND_V = -rudderValueForce * 50; }
if (rudderValueForce > 0.5 && rudderValueForce <= 0.7) { yaw_CMND_V = -rudderValueForce * 60; }
if (rudderValueForce > 0.7 && rudderValueForce <= 1) { yaw_CMND_V = -rudderValueForce * 70; }
//Here we try to put force values based on rudder deflection but divided into many parts to reduce noise and prevent suddend onset of force
if (rudderValueForce >= -0.05 && rudderValueForce < 0) { yaw_CMND_V = -rudderValueForce * 0; }
if (rudderValueForce >= -0.1 && rudderValueForce < -0.05) { yaw_CMND_V = -rudderValueForce * 5; }
if (rudderValueForce >= -0.15 && rudderValueForce < -0.1) { yaw_CMND_V = -rudderValueForce * 10; }
if (rudderValueForce >= -0.20 && rudderValueForce <- 0.15) { yaw_CMND_V = -rudderValueForce * 15; }
if (rudderValueForce >= -0.25 && rudderValueForce <- 0.20) { yaw_CMND_V = -rudderValueForce * 20; }
if (rudderValueForce >= -0.3 && rudderValueForce <- 0.25) { yaw_CMND_V = -rudderValueForce * 25; }
if (rudderValueForce >= -0.5 && rudderValueForce <- 0.3) { yaw_CMND_V = -rudderValueForce * 50; }
if (rudderValueForce >= -0.7 && rudderValueForce <- 0.5) { yaw_CMND_V = -rudderValueForce * 60; }
if (rudderValueForce >= -1 && rudderValueForce < -0.7) { yaw_CMND_V = -rudderValueForce * 70; }
答案 0 :(得分:1)
您可以将所有数据放入数据结构中,以免数据散布在代码中,并且无论您拥有多少数据点,都可以在循环中使用单个 ImageSpan is = new ImageSpan(this,R.mipmap.ic_launcher);
String tx = "dfsfsfsfsfsdfsdfs";
SpannableString ss = new SpannableString(tx);
ss.setSpan(is,0,1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ss.setSpan(CharacterStyle.wrap(is),6,7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tv.setText(ss);
:
if
答案 1 :(得分:0)
您也许可以删除AND,这意味着除第一项检查外,每项检查都不必属于两项。但是以下内容表示即使先前已找到匹配项,每个if语句也会被求值。
int setYaw_CMND_V (float rudderValueForce) {
if (rudderValueForce >= 0 && rudderValueForce <= 0.05) {
return -rudderValueForce * 0;
}
if (rudderValueForce <= 0.1) {
return -rudderValueForce * 5;
}
if (rudderValueForce <= 0.15) {
return -rudderValueForce * 10;
}
// ...
}
最好创建一个一旦if语句设置yaw_CMND_V就返回的函数或方法。然后,不必评估所有的if语句,就像这样:
<?php
// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class LuckyController extends Controller
{
/**
* @Route("/lucky/number", name="luckyNumber")
*/
public function numberAction()
{
$number = random_int(0, 100);
return $this->render('lucky/number.html.twig', [
'number' => $number,
]);
}
}
答案 2 :(得分:0)
您具有平衡的范围,因此您无需检查2个不同的条件,只需取绝对值并使用它即可。正如其他人所说,您需要两次检查某些边界(例如rudderValueForce <= 0.05
和rudderValueForce >= 0.05
),这是不必要的,有时会导致错误的值。只需一次检查一个边界,就可以按升序或降序
auto v = std::abs(rudderValueForce);
if (v > 1)
return; // invalid value, do nothing
else if (v > 0.7)
yaw_CMND_V = -rudderValueForce * 70;
else if (v > 0.5)
yaw_CMND_V = -rudderValueForce * 60;
else if (v > 0.3)
yaw_CMND_V = -rudderValueForce * 50;
else
yaw_CMND_V = -rudderValueForce * (std::ceil(v/0.05) - 1);
0.3以下的范围具有相同的宽度(0.05),因此可以像上面那样简化,而无需使用单独的if块。需要使用ceil
是因为您的范围看起来像(0.25,0.3]。如果范围是最期望的[0.25,0.3],它将更加简单:yaw_CMND_V = -rudderValueForce * int(rudderValueForce/0.05)
。同样,范围(0.3,0.5]和(0.5,0.7]也可以合并为一个公式
-rudderValueForce*(std::ceil((v - 0.3)/0.2)*10 + 40)
但是,根据平台的不同,进行划分可能会非常昂贵,因此对于v> 0.25,v> 0.2,v> 0.15 ...,您可能希望将其拆分为单独的案例。
也就是说,如注释中所述,要优化代码,需要更多上下文