如何在以下程序中执行代码优化?

时间:2010-09-09 07:07:33

标签: c optimization

func()
{
fun1();
fun2();
fun3();
fun4();
fun5();
fun6();
..
..
..
..
fun99();
fun100();
}

通过在C程序中使用函数指针?我需要在程序中反复调用这个程序。

8 个答案:

答案 0 :(得分:7)

不确定这是否真的是优化,但您使用的函数指针如下:

#include <stdio.h>

static void fun1 (void) {
    printf ("1\n");
}
static void fun2 (void) {
    printf ("2\n");
}
static void fun3 (void) {
    printf ("3\n");
}

static void (*fn[])(void) = {
    fun1, fun2, fun3
};

int main (void) {
    int i;
    for (i = 0; i < sizeof(fn) / sizeof(*fn); i++) {
        (fn[i])();
    }
    return 0;
}

输出:

1
2
3

正如所料。

你可以期待的最好的是main可能稍微小一些,但是你需要函数表就可以抵消它。

它在“C如何工作?”中很有用。在现实世界中,有点但不那么有用。

当然函数指针本身很有用,我在C中使用它们做了相当多的状态机和面向对象的代码。只是这个具体的例子似乎是人为的。

如果您想连续执行它们,可以使用:

int main (void) {
    int i = 0;
    while (1) {
        (fn[i])();
        i = (i + 1) % (sizeof(fn) / sizeof(*fn));
    }
    return 0;
}

但是将for循环包装在while (1)内也是一样好。

答案 1 :(得分:6)

你为什么要这样做?

你想要优化什么?代码大小?运行?我会让编译器为我处理(可能暗示一些编译器选项)。

即使使用旧/慢处理器,低内存等进行嵌入式编程,我通常也不会尝试在代码级别进行优化,怀疑编译器可以更好地完成它(即使我放弃到汇编程序)

我更喜欢优化代码以提高可读性和可维护性。

一如既往,ymmv

答案 2 :(得分:3)

没有太多优化。您可以创建一个包含100个函数指针的初始化数组,并迭代它们。它可能会略微减少目标代码的大小,但不会太多,并且会比100次直接调用稍慢(但不是很多)。

void func(void)
{
    static const void (*functions[])(void) =
    {
        fun1,  fun2,  fun3,  ..., fun10,
        ...
        fun91, fun92, fun93, ..., fun100
    }
    for (int i = 0; i < 100; i++)
         (*functions[i])();
}

答案 3 :(得分:3)

如果funn()函数中的任何一个很短,您可能会从having it inlined中受益。您需要查看编译器文档,看看它是否支持程序员有关内联函数的任何明确提示。我认为,有时仅仅使函数static可以提供帮助。

当然,内联只会从实际函数调用中删除代码开销,这取决于函数,可能只占总运行时间的一小部分。

答案 4 :(得分:3)

使用函数指针不太可能为您提供速度优化。首先,您将添加100个指向函数的指针。其次,现在必须通过内存间接调用函数,这比直接调用要慢。第三,您的编译器将更难以进行函数内联。

性能受影响的具体细节取决于编译器和目标平台,但对于x86,除非函数采用相当多的相同参数,否则您实际上不希望使用函数指针路由。如果你想真正优化,为了可读性和速度,你需要重构

修改

如果我们假设32位x86和普通编译器,并且所有函数都不带参数,则在调用站点执行100次连续调用将占用500个字节,因为调用被编码为E8 +四字节eip相对目标偏移量。 / p>

转换为函数指针,你最终会得到一个占用400字节的指针表(这可能会被编码得更小,但由于我们没有被告知定义了funcNNN或编译器,我会假设100标准32位指针)。除此之外,您还需要代码来遍历指针数组并调用函数;此代码取决于您的编译器,Visual C ++ 2010生成的代码是16个字节。所以你节省了84个字节,但代价是执行速度。

如果不了解更多关于所调用的函数的信息,那就更难以评论了。

答案 5 :(得分:2)

此代码的性能很可能由每个函数的内容的执行主导,因此在此级别上很少或根本没有优化。一个明显的优化是将所有内容放在一个函数中;但这可能并不重要。

说实话;如果我看到这样的代码,我会在尝试优化执行之前询问有关设计的严肃问题。这并不是说有一个更好的解决方案,只是看起来异常,所以提出一个问题。

答案 6 :(得分:2)

cc -O3 ......................

将比任何人都更有效地优化它。

答案 7 :(得分:1)

如上所述它只是优化了main()中的代码大小和readbality,而不是任何实际的性能改进。我无法理解他真正想要什么样的优化。请澄清一下?