Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C/C++;应用_C_Linux_Performance - Fatal编程技术网

在C/C++;应用

在C/C++;应用,c,linux,performance,C,Linux,Performance,这是我试图获取资源使用情况的简单方法,特别是在程序执行过程中发生的全部上下文切换 #include<stdio.h> #include <sys/resource.h> int appgetrusage(struct rusage *); int appgetdiffrusage(struct rusage *, struct rusage *); int main() { struct rusage begin, end; appgetrusage

这是我试图获取资源使用情况的简单方法,特别是在程序执行过程中发生的全部上下文切换

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

int appgetrusage(struct rusage *);
int appgetdiffrusage(struct rusage *, struct rusage *);

int main() {
    struct rusage begin, end;

    appgetrusage(&begin);

/*
* core of the program goes here 
* where lot of system threads are spawned and joined
*
*/

    appgetrusage(&end);
    appgetdiffrusage(&begin, &end);

    return 0;
}


int appgetrusage(struct rusage *usage){
    int who = RUSAGE_SELF;
    struct timeval start, end;
    getrusage(RUSAGE_SELF, usage);
    return 1;
}


int appgetdiffrusage(struct rusage *oldr, struct rusage *newr){

    printf("\n");    
    printf("user time (ms): %llu\n",1000 * ((newr->ru_utime).tv_sec - (oldr->ru_utime).tv_sec) + 
            ((newr->ru_utime).tv_usec - (oldr->ru_utime).tv_usec) / 1000);

    printf("system time (ms): %ld\n", 1000 * ((newr->ru_stime).tv_sec - (oldr->ru_stime).tv_sec) + 
            ((newr->ru_stime).tv_usec - (oldr->ru_stime).tv_usec) / 1000);         

    printf("voluntary context switches : %ld\n", newr->ru_nvcsw - oldr->ru_nvcsw);
    printf("involuntary context switches : %ld\n", newr->ru_nivcsw - oldr->ru_nivcsw);

    return 1;
}
#包括
#包括
int appgetrusage(结构rusage*);
int-AppGetDiffuse(struct-rusage*,struct-rusage*);
int main(){
结构图像开始、结束;
appgetrusage(&begin);
/*
*程序的核心在这里
*大量系统线程生成和加入的地方
*
*/
appgetrusage(&end);
AppGetDiffuse(开始和结束(&E));
返回0;
}
int appgetrusage(结构rusage*用法){
int who=RUSAGE_SELF;
结构timeval开始、结束;
getrusage(RUSAGE_SELF,usage);
返回1;
}
int-AppGetDiffusage(结构rusage*oldr,结构rusage*newr){
printf(“\n”);
printf(“用户时间(毫秒):%llu\n”,1000*((新用户->使用时间).tv_秒-(旧用户->使用时间).tv_秒)+
((newr->ru_-utime.tv_-usec-(oldr->ru-utime.tv_-usec)/1000);
printf(“系统时间(毫秒):%ld\n”,1000*((新时间->定时).tv\u秒-(旧时间->定时).tv\u秒)+
((newr->ru_-stime.tv_-usec-(oldr->ru-stime.tv_-usec)/1000);
printf(“自愿上下文切换:%ld\n”,newr->ru\u nvcsw-oldr->ru\u nvcsw);
printf(“非自愿上下文切换:%ld\n”,newr->ru\u nivcsw-oldr->ru\u nivcsw);
返回1;
}
  • 这是正确的方法吗
  • 有人能提出一个替代方案吗?还是更正?:-) 有人能提出一个替代方案吗

    使用perf():

    像这样:

    >perf stat ./my_test 2
    Thread 139828421826304:
    Thread 139828411336448:
    ^[[A./my_test: Terminated
    
     Performance counter stats for './my_test 2':
    
          74333.536760 task-clock                #    1.999 CPUs utilized
                   627 context-switches          #    0.008 K/sec
                    26 cpu-migrations            #    0.000 K/sec
                   282 page-faults               #    0.004 K/sec
          182727508914 cycles                    #    2.458 GHz                     [50.00%]
       <not supported> stalled-cycles-frontend
       <not supported> stalled-cycles-backend
          121168605770 instructions              #    0.66  insns per cycle         [75.00%]
           30262379463 branches                  #  407.116 M/sec                   [74.99%]
               1635031 branch-misses             #    0.01% of all branches         [75.01%]
    
          37.181359478 seconds time elapsed
    
    >性能统计/my_测试2
    线程139828421826304:
    螺纹139828411336448:
    ^[[A./my_测试:终止
    “/my_test 2”的性能计数器统计信息:
    74333.536760任务时钟#使用了1.999个CPU
    627上下文开关#0.008 K/sec
    26 cpu迁移#0.000 K/sec
    282页错误#0.004 K/秒
    182727508914个周期#2.458 GHz[50.00%]
    停止循环前端
    暂停周期后端
    121168605770指令#每周期0.66 INSN[75.00%]
    30262379463分支机构#407.116米/秒[74.99%]
    1635031分支机构未命中率#占所有分支机构的0.01%[75.01%]
    37.181359478秒经过的时间
    
    有人能提出一个替代方案吗

    使用perf():

    像这样:

    >perf stat ./my_test 2
    Thread 139828421826304:
    Thread 139828411336448:
    ^[[A./my_test: Terminated
    
     Performance counter stats for './my_test 2':
    
          74333.536760 task-clock                #    1.999 CPUs utilized
                   627 context-switches          #    0.008 K/sec
                    26 cpu-migrations            #    0.000 K/sec
                   282 page-faults               #    0.004 K/sec
          182727508914 cycles                    #    2.458 GHz                     [50.00%]
       <not supported> stalled-cycles-frontend
       <not supported> stalled-cycles-backend
          121168605770 instructions              #    0.66  insns per cycle         [75.00%]
           30262379463 branches                  #  407.116 M/sec                   [74.99%]
               1635031 branch-misses             #    0.01% of all branches         [75.01%]
    
          37.181359478 seconds time elapsed
    
    >性能统计/my_测试2
    线程139828421826304:
    螺纹139828411336448:
    ^[[A./my_测试:终止
    “/my_test 2”的性能计数器统计信息:
    74333.536760任务时钟#使用了1.999个CPU
    627上下文开关#0.008 K/sec
    26 cpu迁移#0.000 K/sec
    282页错误#0.004 K/秒
    182727508914个周期#2.458 GHz[50.00%]
    停止循环前端
    暂停周期后端
    121168605770指令#每周期0.66 INSN[75.00%]
    30262379463分支机构#407.116米/秒[74.99%]
    1635031分支机构未命中率#占所有分支机构的0.01%[75.01%]
    37.181359478秒经过的时间
    
    Systemtap为分析/调试用户空间和内核代码提供了极好的工具

    用于查找上下文开关的systemtap脚本


    在ARM中,由于uprobes(),用户空间评测还不可用。但是X86,它工作得很好。

    Systemtap为评测/调试用户空间和内核代码提供了极好的工具

    用于查找上下文开关的systemtap脚本


    在ARM中,由于uprobes()的原因,用户空间分析还不可用.但是X86,它工作得很好。

    你们已经共享了最好的资源,比如perf和systemtap,但是如果有人不想深入研究那么多,那么RHEL6或内核2.6.23附带的sysstat包以及更高版本都有一个名为pidstat的东西。将pidstat与
    -w
    一起使用,它将为您提供自愿的以及非自愿的上下文切换。

    你们已经共享了最好的资源,比如perf和systemtap,但是如果有人不想深入研究那么多,那么RHEL6或内核2.6.23附带的sysstat包以及后来的一个名为pidstat的包。将pidstat与
    -w
    一起使用,它也会提供自愿的总数l作为非自愿的上下文切换。

    为什么您关心上下文切换?对您来说,测量实时和CPU时间不够吗?几个上下文切换会降低系统的性能。例如,非自愿的上下文切换数量越多,总是不好的。这意味着基础系统或库中存在严重错误当然,上下文切换取决于时间,但最重要的是时间……上下文切换也取决于系统的其他部分(不仅仅是应用程序…)…我同意!上下文切换取决于整个系统。因为我有一个应用程序性能下降的问题。我想知道原因:-)你认为我计算上下文切换差异的方法如何?这对研究资源使用率更高的问题有帮助吗:-)你为什么关心上下文切换ches?测量实时和CPU时间还不够吗?几个上下文切换会降低系统的性能。例如,非自愿的上下文切换数量过多总是不好的。这意味着基础系统或库中当然存在严重错误,但重要的是最终的时间……并且继续ext开关还依赖于系统的其余部分(不仅仅是应用程序…)。我同意!上下文开关依赖于整个系统。因为我有一个应用程序性能下降的问题。我对k感兴趣