C++ 需要优化串行数据传输

C++ 需要优化串行数据传输,c++,serial-port,serial-communication,C++,Serial Port,Serial Communication,我目前的职能是: void Path(Point j){ if(j.y > 0 && j.y <= a){ char moveMsg[1] = {'j'}; write(fd1, moveMsg, 1); } else if(j.y > a && j.y <= b){ char moveMsg[1] = {'i'}; write(fd1, moveMsg, 1); }

我目前的职能是:

void Path(Point j){
   if(j.y > 0 && j.y <= a){
      char moveMsg[1] = {'j'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > a && j.y <= b){
      char moveMsg[1] = {'i'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > b && j.y <= c){
      char moveMsg[1] = {'h'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > c && j.y <= d){
      char moveMsg[1] = {'g'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > d && j.y <= e){
      char moveMsg[1] = {'f'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > e && j.y <= f){
      char moveMsg[1] = {'e'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > f && j.y <= g){
      char moveMsg[1] = {'d'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > g && j.y <= h){
      char moveMsg[1] = {'c'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > h && j.y <= i){
      char moveMsg[1] = {'b'};
      write(fd1, moveMsg, 1);
   }
   else if(j.y > i && j.y <= r){
      char moveMsg[1] = {'a'};
      write(fd1, moveMsg, 1);
   }
}
void路径(点j){
如果(j.y>0&&j.y a&&j.y b&&j.y c&&j.y d&&j.y e&&j.y f&&j.y g&&j.y h&&j.y i&&j.y
  • 如果变量
    a
    b
    c
    、…
    i
    r
    的整数值单调递增,则可以优化If条件
  • 结构元素和数组元素的重复访问可以优化为局部定标器变量
  • 可以消除局部变量的重复分配和取消分配,以实现时间优化
  • 为了空间优化和代码可维护性,可以消除重复的write()系统调用

  • 二进制比较算法可以改进顺序比较。
    与最多执行十条if语句不同,最多可以是四条(加上系统调用的布尔测试)。
    原始代码在每个if中都有两个整数比较和一个逻辑运算(成本不高),但可以优化为每个if中只有一个比较

以下各项(经过测试和测试)可能是空间和时间的最佳选择

void Path(Point j)
{
   int val = j.y;
   char moveMsg = 0;

   /* ASSERT(0 < a < b < c < d < e < f < g < h < i < r) */

   if (val <= e) {
      if (val <= b) {
         if (val <= a) {
            if (val > 0)   /* && val <= a */
               moveMsg = 'j';
         } else    /* val <= b && val > a */
            moveMsg = 'i';
      } else {  
         if (val <= c)      /* && val > b */
            moveMsg = 'h';
         else if (val <= d) /* && val > c */
            moveMsg = 'g';
         else      /* val <= e && val > d */
            moveMsg = 'f';
      }
   } else {
      if (val <= h) {
         if (val <= f)      /* && val > e */
            moveMsg = 'e';
         else if (val <= g) /* && val > f */
            moveMsg = 'd';
         else      /* val <= h && val > g */
            moveMsg = 'c';    
      } else {
         if (val <= i)      /* && val > h */
            moveMsg = 'b';
         else if (val <= r) /* && val > i */
            moveMsg = 'a';
      }
   }

   if (moveMsg)
      write(fd1, &moveMsg, 1);
}
void路径(点j)
{
int val=j.y;
char-moveMsg=0;
/*断言(0如果(val)在您对
write
进行函数调用时,为什么不将
char
放在其中,而不是定义一个变量?即
write(fd1,'d',1)
?我想这可能会更快,因为你不是每次都定义一个字符。而且,你的
if
条件有点奇怪。例如,
j.y>b&&j.y变量a,b,c,…I,r的关系是什么?如果它们是单调递增的,那么if条件可以大大简化。我看到很多其他的代码imization是可能的,但是一个好的优化编译器也应该能够做到这一点。这样的优化会比时间节省更多的代码空间,而且时间节省可能不会达到毫秒的数量级,除非你有一个非常慢的处理器。此外,还不清楚你是如何衡量这个响应时间的,也就是说,你可能没有显示足够的代码。如果对串行数据传输有任何不同,重新编译此代码会有多大影响?您不指定波特率,如果是115200,则传输一个字节需要100us。对于1ghz的cpu,摆弄这些代码行不会改变这一点超过几ns。由于M的分辨率,变量a、b、c……当前的增量为24在。它们可能会改变,所以我不知道是否有更简单的方法来增加它。我使用115200波特,但接收代码是优化的,而在这段代码中运行大约需要600个时钟周期,我觉得它可以从中减少。接收代码在Arduino上,Arduino代码非常简单o优化,因为实际上没有太多。它基本上只是一个读取命令,然后将一些引脚设置为高/低。你能解释一下为什么你会这样做if语句吗?为什么通过更多if语句可以使它更快?这对我来说似乎是违反直觉的。@tydcghk--参见附录。我仍然对更大的图景感到好奇。哟你还没有澄清你在衡量什么或如何衡量性能。感谢你的澄清。我一直在衡量性能时间,以查看代码的哪些部分花费了时间,并在花时间最多的部分上工作,这部分是唯一给我带来麻烦的部分。当我从if语句中去掉char定义时,它给我错误,说字符与const void不匹配*…呃,这是我制作篮筐接球的代码的一部分,所以我猜性能的衡量标准是它是否接住了球。我目前离篮筐足够近,以至于篮筐将球撞开。仅仅表示感谢是否意味着你不必费心使用或衡量改进程度?仅供参考,此优化代码已编译并测试其正确性。“当我从if语句中删除字符定义时,它会给我错误…”--如果您指的是带有初始化的
char
声明,那么这些语句需要进行适当的编辑才能被重用为赋值语句。我们不能期望更正未发布的代码。您反复提到试图定义/声明
moveMsg
似乎表明类型错误(这可能不会节省任何空间或时间)。从面向对象编程的角度来看,转换函数(将输入值匹配到某个范围)应该与输出(syscall)步骤分开。将这两个步骤混合在一起的原始代码并不理想。