使用结构和变量作为函数的输入参数之间的速度差异

时间:2016-11-14 09:36:27

标签: c performance optimization struct embedded

为了优化具有相同模式的函数,我正在考虑两种实现方式。 可以使用该功能的环境在嵌入式软件的中断内部。这就是为什么我遇到困难,因为需要考虑速度容量。 在我看来,以下情况1和2具有相同的速度功能。但是我的同事说可能会有区别,因为第一种情况需要使用指针访问,但第二种情况不需要。 哪一个更快? 我需要你的帮助才能快速实现高效的代码。

typedef struct
{
  unsigned char member1;
  unsigned char member2;
  ..
  unsigned char member10;
} my_struct

my_struct input[10];

void My_ISR1( void )
{
  ...
  sub_func1( input[1] );
  return 0;
}
void My_ISR2( void )
{
  ...
  sub_func1( input[2] );
  return 0;
}
void sub_func1( my_struct my_struct_input )
{
  if( my_struct_input.member1 < my_struct_input.member2 )
  {
    ...
  }
  ...
  return 0;
}

CASE2)

unsigned char member1of1;
unsigned char member2of1;
...
unsigned char member10of10;

void My_ISR1( void )
{
  ...
  sub_func1( member1of1, ..., member10of1 );

  return 0;
}

void My_ISR2( void )
{
  ...
  sub_func1( member1of2, ..., member10of2 );

  return 0;
}

void sub_func1( unsigned char member1, 
                unsigned char member2, ..., 
                unsigned char member 10 )
{
  if( member1 < member2 )
  {
    ...
  }
  ...
  return 0;
}

1 个答案:

答案 0 :(得分:2)

唯一的方法是确定一个实现是否比另一个实现更快,对于编译器,问题空间,代码,硬件,特定用例,都要测量它。

然而,在提出的两个选项中,我希望pass-by-struct稍快一些(顺便说一句,在你的代码中你 传递通过指针)

在两种情况下,变量的副本都会传递给函数。 在这两种情况下,这会产生10个字节的副本,但是如果结构是连续的,则可能会稍快一些。

然而,更好的选择可能是通过指针传递,例如:

void sub_func1( my_struct* my_struct_input )
{
    if(my_struct_input->member1 < my_struct_input<member2)
    ///........
}

这样,我们只复制一个(大概是32位,但它取决于)地址,而不是复制10个单独的变量或10个字节的结构。

它确实有缺点,你现在在与调用者完全相同的结构上运行,但可以使用const指针解决这个问题。

还要考虑的另一件事是,虽然函数调用在一种情况下可能更快,但您必须查看更大的图片。虽然传递结构指针应该更快,但您还必须考虑构造结构的开销 - 如果必须从现有变量中分配结构成员,这显然会增加额外的处理,这必须考虑在内。