С медленный вызов функции - PullRequest
1 голос
/ 09 апреля 2019

Как я могу разместить свои функции в другом файле 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:\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.ч

#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 Ответ

7 голосов
/ 09 апреля 2019

Если вы компилируете в объектные файлы, 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" или "межпроцедурной" оптимизацией :

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 означает «оптимизация времени соединения»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...