从0到99计数

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段显示器,并试图制作秒表.

Chr*_*phe 5

任何像样的优化编译器会来,结果tensones包含9在最终的基础上不断传播,循环展开和死代码消除.

现在,根据您的真实循环体,并没有考虑到聪明的编译器优化,您可以分析您的代码,计算操作类型:

  • 解决方案1:11初始化,121次比较,110次增量,200次分配
  • 解决方案2:1初始化,101次比较,100次递增,200次分配,200次分裂操作(模数和除法),100次减法

那么它取决于CPU架构和其他因素:

  • 如果假设所有操作都采用一个假设的CPU周期,那么解决方案1将明显获胜.
  • 但实际上它要复杂得多,考虑到硬件优化,如缓存,分支预测等,还要考虑模数和除法的成本.因此,最好的方法肯定是使用一些基准测试代码来衡量.

编辑:关于您的代码更改

如果函数执行一些副作用(显示等),那么当然,你的循环体将不会被优化掉.我所做的其余评论仍然是正确的,因为解决方案1和解决方案2都使用相同的参数调用附加函数相同的次数.