Shi*_*ato 4 c++ performance for-loop
在C++中,以下哪个解决方案从0到99计数更加健壮和可靠,并将每个迭代存储在数十个和一个位置的变量中?如何改进任何一种方法,使其尽可能快速和非资源密集?
typedef int (*IntFunction) (int* _SegmentList);
int display1SegmentPinNums[] = {...pin numbers...};
int display2SegmentPinNums[] = {...other pin numbers...};
// Then I have some functions that display a number to 7-segment displays. They each return an integer 1 and have a parameter of (int* _SegmentList), as per the type definition above
// An array of all the functions
IntFunction displayFunctions[10] = {display_0, display_1, display_2, display_3, display_4, display_5, display_6, display_7, display_8, display_9};
// Solution 1
for (int tens = 0; tens < 10; tens++)
{
for (int ones = 0; ones < 10; ones++)
{
displayFunctions[tens](display1SegmentPinNums);
displayFunctions[ones](display2SegmentPinNums);
}
}
// Solution 2
for (int i = 0; i < 100; i++)
{
ones = (i % 10);
tens = ((i - ones) / 10);
displayFunctions[tens](display1SegmentPinNums);
displayFunctions[ones](display2SegmentPinNums);
}
Run Code Online (Sandbox Code Playgroud)
编辑:我已经包含了我的完整代码的简化版本.希望它有助于更好地得到答案.这是一个Arduino项目BTW,有7段显示器,并试图制作秒表.
任何像样的优化编译器会来,结果tens与ones包含9在最终的基础上不断传播,循环展开和死代码消除.
现在,根据您的真实循环体,并没有考虑到聪明的编译器优化,您可以分析您的代码,计算操作类型:
那么它取决于CPU架构和其他因素:
编辑:关于您的代码更改
如果函数执行一些副作用(显示等),那么当然,你的循环体将不会被优化掉.我所做的其余评论仍然是正确的,因为解决方案1和解决方案2都使用相同的参数调用附加函数相同的次数.