gpt4 book ai didi

C慢函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:08 25 4
gpt4 key购买 nike

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

strcpy:                 0.485000
strcpyFunc: 0.469000
strcpyFuncInAnotherC: 2.015000

甚至尝试过内联,但似乎它从来没有内联任何东西,因为 exe 文件保持他的小尺寸,而且时间是一样的。

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

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

这里是 bench 代码(没有 main.h 就完成了)

ma​​in.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);
}

最佳答案

如果你正在编译目标文件,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 代表“链接时优化”)

关于C慢函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55583586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com