我想分享我最近遇到的一个测试问题,并就此进行讨论:
编写一个粗略测量上下文切换开销的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);
}
令人惊讶的是,我上面提供的答案在这次测试中被认为是正确的。
然而,为了优化精度,我们应该排除“printf”方法,使用Alex Hoppus提到的带有无效参数的系统调用或空方法。
最后,结果应除以2,如Alex Hoppus所述。
你应该尝试不同的方法。
如前所述,您正在尝试测量
上下文切换的开销
从用户到内核的上下文切换是通过系统调用完成的。当然,下面的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上运行吗?