If statement 如果语句未执行,则会减慢程序的速度

If statement 如果语句未执行,则会减慢程序的速度,if-statement,arduino,If Statement,Arduino,我有一个当前从未执行过的if语句,但是如果我在屏幕上打印一些东西,程序运行所需的时间是声明变量所需时间的十倍以上。在网上做一些研究,这似乎是一个分支预测问题。我能做些什么来提高程序速度吗 基本上,myTest和myTest_new都返回相同的东西,只是一个是宏,一个是函数。我只是在监控执行Bitest所需的时间。它只需在if语句中声明,就可以在3秒钟内执行,但在if语句中使用Serial.print时,即使两个语句都没有执行,它也需要一分钟的时间 void bitTest() { int c

我有一个当前从未执行过的
if
语句,但是如果我在屏幕上打印一些东西,程序运行所需的时间是声明变量所需时间的十倍以上。在网上做一些研究,这似乎是一个分支预测问题。我能做些什么来提高程序速度吗

基本上,myTest和myTest_new都返回相同的东西,只是一个是宏,一个是函数。我只是在监控执行Bitest所需的时间。它只需在if语句中声明,就可以在3秒钟内执行,但在if语句中使用Serial.print时,即使两个语句都没有执行,它也需要一分钟的时间

void bitTest()
{
  int count = 0;
  Serial1.println("New Test");
  int lastint = 0;
  Serial1.println("int");
  for (int index = -2147483647; index <= 2147483647; index+=1000) {
    if (index <= 0 && lastint > 0) {
      break;
    }
    lastint = index;   

    for (int num = 0; num <= 31; num++) {
      ++1000;
      int vcr1 = myTest(index, num);
      int vcr2 = myTest_new(index, num);
      if (vcr1 != vcr2) {
        Serial1.println("Test"); // leave this println() and it takes 300 seconds for the test to run
        //int x = 0;
      }
    } // if (index)
  } // for (index)



  Serial1.print("count = ");

  Serial1.println(count);

  return;

}
void bitest()
{
整数计数=0;
序列1.println(“新测试”);
int-lastint=0;
Serial1.println(“int”);

对于(int index=-2147483647;index而言,分支预测(该分支预测不应受到代码内部操作的影响)引起的可能性要小得多,但实际上

{
   int x = 0;
}
只是什么也不做,因为
x
的作用域在
}
处结束,因此编译器只是简单地抛弃了整个
if
子句,包括check。请注意,这是可能的,因为
if
检查的表达式没有副作用,并且将执行的块也没有副作用

void bitTest()
{
  int count = 0;
  Serial1.println("New Test");
  int lastint = 0;
  Serial1.println("int");
  for (int index = -2147483647; index <= 2147483647; index+=1000) {
    if (index <= 0 && lastint > 0) {
      break;
    }
    lastint = index;   

    for (int num = 0; num <= 31; num++) {
      ++1000;
      int vcr1 = myTest(index, num);
      int vcr2 = myTest_new(index, num);
      if (vcr1 != vcr2) {
        Serial1.println("Test"); // leave this println() and it takes 300 seconds for the test to run
        //int x = 0;
      }
    } // if (index)
  } // for (index)



  Serial1.print("count = ");

  Serial1.println(count);

  return;

}

顺便说一句,你展示的代码通常会直接被“编译掉”,因为编译器在编译时可以决定
if
子句是否可以执行,除非你明确告诉编译器忽略这些安全优化。因此,我有点怀疑你的“10倍慢”度量。要么您正在展示的代码不是您演示这一点的实际示例,要么您应该在进行性能比较之前启用编译器优化功能。

您的程序花费很长时间的原因是它有缺陷:

for (int index = -2147483647; index <= 2147483647; index+=1000) {
在C中应该是非法的,因为你不能增加一个常量数字。这是非常WTF


总而言之,你的程序乱七八糟。重新编写它,然后调试一个干净的、定义良好的版本。

此外,I/O速度非常慢,特别是在控制台上。@EOF:没关系,因为OP声称它从未执行过。你的问题很难理解。与“不打印”相比,先到终端的速度非常慢,正如您所了解的。但我不知道priting与删除变量有什么关系。就目前情况而言,这个问题可能已经结束,因为它不是clear@jimmcnamara非常确定OP想说的是“
如果
子句的内容从未执行过,那么为什么它会对该子句中的内容的性能产生影响?”我所说的慢是指执行程序需要一分钟以上。这是一个非常慢的情况。好吧,不管你做什么,这些行都不会花一分钟来执行。你在其他地方有一个bug。在这种情况下,你的代码是非常不完整的。或者你错了,执行了
if
子句,以及
序列中的某些内容.打印
需要很长时间。