如何在不损失执行时间的情况下将函数放在另一个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);
}
答案 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
代表“链接时间优化”)