c - 获取另一个二进制执行的时间 C

标签 c time

我是新来的。我一直在尝试获取给定二进制文件的执行时间(可能是也可能不是我自己开发/编译的。我从 here 得到了这个 getTime() 函数!。

我编写了一个小程序来调用另一个程序并确定第二个程序执行所需的时间,但我没有获得预期的结果。程序几乎立即退出,并且输出时间非常短(即使我执行的程序确实非常耗时)

这是我写的程序。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <string.h>
#include <sys/types.h> // for pid_t 
#include <sys/wait.h> // for wait 

double getTime (void);
char**  argsCollect(int total, int from, char* source[]);
char*   newString(int len);
void freeCollected(char **collection, int len);
static double Load_time;

int main(int ac, char *av[]){

    char **my_args = argsCollect(ac, 2, av);

    Load_time = getTime ();
    pid_t pid = fork();

    if (pid==0) { // child process 
        execv(av[1], my_args);
            exit(127); // only if execv fails 
    }
    else { /* pid!=0; parent process */
            int finished = waitpid(pid,0,0); // wait for child to exit      

        Load_time = getTime() - Load_time;
        printf("Finished child: %d, Tiempo: %f\n", finished, Load_time);    

        freeCollected(my_args, (ac - 1));
    }

    return 0;
}

double getTime (void){
    double usertime, systime;
    struct rusage usage;

    getrusage (RUSAGE_SELF, &usage);

    usertime = (double) usage.ru_utime.tv_sec +
        (double) usage.ru_utime.tv_usec / 1000000.0;

    systime = (double) usage.ru_stime.tv_sec +
        (double) usage.ru_stime.tv_usec / 1000000.0;

    return (usertime + systime);
}

char** argsCollect(int total, int from, char* source[]){
    int collect = total - from;
    int i;

    char** mem_dest = (char**)malloc((collect) * sizeof(char*));

    for(i = from; i < total; i++){
        mem_dest[i-from] = newString(strlen(source[i]));
        strcpy(mem_dest[i-from], source[i]);
    }   

    return mem_dest;
}

char* newString(int len){
    char *new_string = (char*)malloc(len * sizeof(char));

    return new_string;
}

void freeCollected(char **collection, int len){
    int i;

    for(i = 0; i < len; i++){
        free(collection[i]);
    }
    free(collection);
}

我用这段代码测试了 getTime() 函数

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include <sys/time.h>
#include <sys/resource.h>

double getTime (void);
static double Load_time;

int main()
{
    int i;
    int max = 1000000000;
    int j = 0;  

    Load_time = getTime ();

    for(i = 0; i < max; i++){   // This is 
        j++;        // just to
    }           // do something

    Load_time = getTime () - Load_time;
    printf("time: %.2f, j: %d\n", Load_time, j);

    return 0;
}

double getTime (void){
    double usertime, systime;
    struct rusage usage;

    getrusage (RUSAGE_SELF, &usage);

    usertime = (double) usage.ru_utime.tv_sec +
        (double) usage.ru_utime.tv_usec / 1000000.0;

    systime = (double) usage.ru_stime.tv_sec +
        (double) usage.ru_stime.tv_usec / 1000000.0;

    return (usertime + systime);
}

我真的很感激有关如何使其正常工作以及我做错了什么的见解。 提前谢谢大家。

最佳答案

仅供记录。两周后我是如何解决这个问题的。

我将 double getTime(void) 函数修改为 double getTime(int who) 函数,这在以下初始代码的改编中进行了描述。

新来源

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <string.h>
#include <sys/types.h> // for pid_t 
#include <sys/wait.h> // for wait 

double getTime (int who);
static double Load_time;

int main(int ac, char *av[]){
    int status;

    Load_time = getTime(RUSAGE_SELF);
    pid_t pid = fork();

    if (pid==0) { // child process 
        execv(av[1], &av[2]);
            exit(127); // only if execv fails 
    }
    else { /* pid!=0; parent process */
            int finished = waitpid(pid,&status,0); // wait for child to exit      

        Load_time = getTime(RUSAGE_CHILDREN) - Load_time;
        printf("Finished child: %d, Tiempo: %f\n", finished, Load_time);            
    }

    return 0;
}

double getTime (int who){
    double usertime, systime;
    struct rusage usage;

    getrusage (who, &usage);

    usertime = (double) usage.ru_utime.tv_sec +
        (double) usage.ru_utime.tv_usec / 1000000.0;

    systime = (double) usage.ru_stime.tv_sec +
        (double) usage.ru_stime.tv_usec / 1000000.0;

    return (usertime + systime);
}

通过该参数,函数可以得知子进程使用的总时间。请注意,当使用 RUSAGE_CHILDREN 调用时,struct rusage use 结构中的时间将是由父进程(包括孙子进程)生成且已被其父进程正确等待的每个子进程的时间。

关于c - 获取另一个二进制执行的时间 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23258057/

相关文章:

c - read() 和 write() 未按预期工作

c++ - SSE 类型的 pow

c++ - 非常具体的未解析外部符号 type_info::`vftable 在/NODEFAULTLIB 可执行文件中使用虚拟函数时

通过双指针字符串的引用调用

python-2.7 - 在 python 中制作带有日期的 bins 列

c# - 解析时间、日期/时间或日期

c - 在 C 中将时间间隔除以整数

c - 函数通过c中的多个定界符将字符串拆分为数组

javascript - 如何使用 javascript 或 jquery 将时间转换为 javascript-timestamps?

php - 当 PHP 是您的主要语言时,在 SQL Server 数据库中存储日期/时间的首选格式是什么?