当前位置: 首页 > 知识库问答 >
问题:

在C中不使用pthread测量开销

劳烨
2023-03-14

我想分享我最近遇到的一个测试问题,并就此进行讨论:

编写一个粗略测量上下文切换开销的C程序

我想与更高级的C程序员讨论这个问题的不同选择。

我在C编程方面的知识有限,为了提供一个可接受的答案,我对自己进行了记录:

https://eli.thegreenplace.net/2018/measuring-context-switching-and-memory-overheads-for-linux-threads/

https://www.researchgate.net/post/How_can_I_measure_thread_creation_and_destruction

https://github.com/eliben/code-for-blog/blob/master/2018/threadoverhead/thread-pipe-msgpersec.c

尽管我的知识有限,但我很快意识到这个问题的模糊性。事实上,这个问题并没有规定答案是否应该以时间或记忆为单位给出。

我个人选择发展我的推理,用图书馆的时间来衡量时间。还有一个非常简单的片段。结果应除以1 000 000。

我的回答有意义吗?还是我完全没有抓住重点?

#include<time.h>
#include<stdio.h>
int main(){
    clock_t begin=clock();

    int i;
    for(i=0;i<1000000;i++){
        printf("%d",i);
    }
    clock_t end=clock();
    printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

共有2个答案

黎曾笑
2023-03-14

令人惊讶的是,我上面提供的答案在这次测试中被认为是正确的。

然而,为了优化精度,我们应该排除“printf”方法,使用Alex Hoppus提到的带有无效参数的系统调用或空方法。

最后,结果应除以2,如Alex Hoppus所述。

郤坚诚
2023-03-14

你应该尝试不同的方法。

如前所述,您正在尝试测量

上下文切换的开销

从用户到内核的上下文切换是通过系统调用完成的。当然,下面的printf使用的是写系统调用,但这个系统调用太重,无法得到可靠的估计。为了改进这种估计,您应该回答以下问题:linux中最快的系统调用是什么?答案是-syscall,参数无效。

另外,不要忘记测量精度。你也应该把你的结果除以2,因为系统调用是一个往返过程。

 类似资料:
  • 问题内容: 我有一个main.c,其全局变量名为。在main()中,我启动一个pthread,它侦听一个TCP连接并通过(progserver.c)运行该线程。意味着,该线程将永远不会返回。在main()中,输入rm.c(RM =资源管理器)中的函数。在rm.c中,我在pthread的progserver.c中读取了此变量的内容(两者均可通过进行访问)。 因此,问题是,当我在pthread中写入并

  • 问题内容: pthread问题: 似乎只有在其他线程调用pthread_cond_notify之前调用pthread_cond_wait时,条件变量才起作用。如果在等待之前以某种方式发生通知,则等待将卡住。 我的问题是: 什么时候应该使用条件变量? 调度程序可以抢占线程,并且在等待之前可能会发生通知。 等待信号量没有这个问题-它们有一个计数器。 什么时候条件变量比信号量更好? 这是一个测试: 文件

  • 我在一个函数中创建了新的线程,其中包括pthread。h、 但它不起作用,编译时我不断收到以下错误: 未定义对“pthread\u create”的引用 我用来编译的标志如下: CFLAGS=-std=gnu99-pthread-g-Wall-Wextra-Werror-Wmissing声明-Wmissing原型-Werror隐式函数声明-Wreturn类型-Wparentheses-Wunuse

  • 我是卡桑德拉的新人。我必须使用c#在卡桑德拉中一次性插入50000行。我正在使用卡桑德拉c#驱动程序。我正在使用以下代码在卡桑德拉中插入数据。请帮帮我 我收到错误:批处理中的语句无效:只允许UPDATE、INSERT和DELETE语句。

  • 我一直在寻找一种合适的方法来衡量Linux操作系统中各种系统调用的成本。过去有许多与此主题相关的问题,没有一个提供如何准确测量的详细描述。大多数答案都武断地宣称,系统调用的成本为1-2us,如果它在CPU上缓存,则为100个周期。 系统调用开销 系统开销 我能想到的测量系统调用成本的天真方法是在getpid()等系统调用中使用rdtscp指令。然而,这不足以准确测量open()、read()或wr

  • 我正在阅读有关C中线程的教程并测试了以下代码: 我试图使用gcc和g编译此代码,但我总是遇到编译错误。 使用gcc-pthread thread_test.c: /tmp/ccmpQLyp。o: 在函数std::cout'thread_test.cpp: 你能帮忙吗?我必须做些什么才能让这段代码在Linux和Windows上运行吗?