为了优化具有相同模式的函数,我正在考虑两种实现方式。 可以使用该功能的环境在嵌入式软件的中断内部。这就是为什么我遇到困难,因为需要考虑速度容量。 在我看来,以下情况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;
}
答案 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
指针解决这个问题。
还要考虑的另一件事是,虽然函数调用在一种情况下可能更快,但您必须查看更大的图片。虽然传递结构指针应该更快,但您还必须考虑构造结构的开销 - 如果必须从现有变量中分配结构成员,这显然会增加额外的处理,这必须考虑在内。