C慢函数调用

时间:2019-04-09 00:40:43

标签: c

如何在不损失执行时间的情况下将函数放在另一个c文件中?

strcpy:                 0.485000
strcpyFunc:             0.469000
strcpyFuncInAnotherC:   2.015000

甚至尝试过内联,但是似乎从未内联任何东西,因为exe文件保持其较小的尺寸,并且时间相同。

我用mingw32-gcc在code :: block下编译

我正在学习C,非常感谢您帮助我理解如何正确处理包含多个.c文件的项目...

这里是基准代码(在没有main.h的情况下完成)

main.c

#include <stdio.h>
#include <string.h>
#include <windows.h>//for GetTickCount

#include "func.h"

void double2str(const double x, char *buf) {
    sprintf(buf, "%.6f", x);
    }
double milliTick(void) {
    return GetTickCount()/1000.0;
    }
double timeDiff(const double start, const double end) {
    return end-start;
    }

void strcpyFunc(char *buf, const char *str) {
    strcpy(buf, str);
    }

int main() {
    char buf64[24];
    char buf[1024];
    char bufBench[32];
    char *sample = "abcdefghijklmnopqrstuvwxyz";

    double timeStart1=0, timeEnd1=0;
    double timeStart2=0, timeEnd2=0;
    double timeStart3=0, timeEnd3=0;

    size_t len = 99999999;
    size_t i = 0;

    timeStart1 = milliTick();
    while(i < len) {
        strcpy(bufBench, sample);
        i++;
        }
    timeEnd1 = milliTick();

    i = 0;
    timeStart2 = milliTick();
    while(i < len) {
        strcpyFunc(bufBench, sample);
        i++;
        }
    timeEnd2 = milliTick();

    i = 0;
    timeStart3 = milliTick();
    while(i < len) {
        strcpyFuncInAnotherC(bufBench, sample);
        i++;
        }
    timeEnd3 = milliTick();

    strcpy(buf, "");
    double2str(timeDiff(timeStart1,timeEnd1), buf64);
    strcat(buf, "strcpy:\t\t\t");
    strcat(buf, buf64);
    strcat(buf, "\n");
    double2str(timeDiff(timeStart2,timeEnd2), buf64);
    strcat(buf, "strcpyFunc:\t\t");
    strcat(buf, buf64);
    strcat(buf, "\n");
    double2str(timeDiff(timeStart3,timeEnd3), buf64);
    strcat(buf, "strcpyFuncInAnotherC:\t");
    strcat(buf, buf64);
    strcat(buf, "\n");

    printf(buf);

    return 0;
    }

func.h

#ifndef HEADER_FUNC_H
#define HEADER_FUNC_H

void strcpyFuncInAnotherC(char *buf, const char *str);

#endif

func.c

#include <stdio.h>
#include <string.h>

#include "func.h"

void strcpyFuncInAnotherC(char *buf, const char *str) {
    strcpy(buf, str);
    }

1 个答案:

答案 0 :(得分:7)

如果要编译为目标文件,则ala:

gcc -O3 -o main.o main.c
gcc -O3 -o func.o func.c
gcc -O3 -o a.out main.o func.o

然后,编译器将优化每个目标文件(main和func),但将它们组合在一起时无法优化文件。

这是有原因的:有些项目有数百个目标文件,而进行全局优化会大大增加编译时间。反过来,这将使迭代测试变得困难。

但是,您可以强制使用所谓的“ link-time" or "interprocedural" optimization

gcc -O3 -flto -o main.o main.c
gcc -O3 -flto -o func.o func.c
gcc -O3 -flto -o a.out main.o func.o

现在,编译器的行为就好像所有代码都在一个源文件中一样。 (-flto代表“链接时间优化”)