C медленный вызов функции

#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