#c
#c
Вопрос:
Как я могу поместить свои функции в другой файл c без потери времени выполнения?
strcpy: 0.485000
strcpyFunc: 0.469000
strcpyFuncInAnotherC: 2.015000
Даже пробовал с помощью inline, но, похоже, он никогда ничего не вставлял, потому что 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:ttt");
strcat(buf, buf64);
strcat(buf, "n");
double2str(timeDiff(timeStart2,timeEnd2), buf64);
strcat(buf, "strcpyFunc:tt");
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. Можете ли вы показать нам командную строку, которую вы используете для компиляции кода?
Ответ №1:
Если вы компилируете в объектные файлы, 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), но не может оптимизировать файлы, когда они собраны вместе.
Для этого есть причина: некоторые проекты содержат сотни объектных файлов, и выполнение глобальной оптимизации значительно увеличит время компиляции. Это, в свою очередь, затруднило бы итеративное тестирование.
Однако вы можете принудительно выполнить так называемую оптимизацию «во время соединения» или «межпроцедурную»:
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
расшифровывается как «оптимизация времени соединения»)
Комментарии:
1. Спасибо всем за все ваши предложения, я проведу расследование таким образом… Я не пишу вручную команды, его code::block, которые это делают, и добавление только командной строки -flto к опции построения дает мне эти ошибки :
2. mingw32-gcc.exe -Стена -Преобразование -ftrapv -Wtype-пределы -Wstrict-переполнение=5 -fstrict-переполнение -Wsign-сравнение -flto -O3 -c «C:DevWin32FuncSpeedfunc.c » -o objRelease func.o
3. mingw32-gcc.exe -Стена -Преобразование -ftrapv -Wtype-пределы -Wstrict-переполнение=5 -fstrict-переполнение -Wsign-сравнение -flto -O3 -c «C:DevWin32FuncSpeedmain.c » -o objReleasemain.o
4. mingw32-g .exe -о binReleaseFuncSpeed.exe objReleasefunc.o objReleasemain.o -s
5. lto1.exe : внутренняя ошибка компилятора: не удается прочитать LTO decl из obj Release func.o