- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个简单的微基准测试试图测量线程和进程切换的开销,但进程切换的开销结果低于线程切换的开销,这是出乎意料的。设置:1.8GHz Core 2 Duo、2GB RAM、Linux 2.6.32-21-generic x86_64 (Ubuntu 10.04)。我得到:
我也尝试过使用 numactl --physcpubind=0
和 likwid-pin -c0
运行,但这似乎只会将线程切换减慢到 5us。任何人都知道评估有什么问题,或者这些结果是否正确,为什么?
代码在下面的 URL 中,r1667 粘贴在这里:
https://assorted.svn.sourceforge.net/svnroot/assorted/sandbox/trunk/src/c/process_switch_bench.c
// on zs, ~2.1-2.4us/switch
#include <stdlib.h>
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/time.h>
#include <pthread.h>
uint32_t COUNTER;
pthread_mutex_t LOCK;
pthread_mutex_t START;
sem_t *s0, *s1, *s2;
void * threads (
void * unused
) {
// Wait till we may fire away
sem_wait(s2);
for (;;) {
pthread_mutex_lock(&LOCK);
pthread_mutex_unlock(&LOCK);
COUNTER++;
sem_post(s0);
sem_wait(s1);
}
return 0;
}
int64_t timeInMS ()
{
struct timeval t;
gettimeofday(&t, NULL);
return (
(int64_t)t.tv_sec * 1000 +
(int64_t)t.tv_usec / 1000
);
}
int main (
int argc,
char ** argv
) {
int64_t start;
pthread_t t1;
pthread_mutex_init(&LOCK, NULL);
COUNTER = 0;
s0 = sem_open("/s0", O_CREAT, 0022, 0);
if (s0 == 0) { perror("sem_open"); exit(1); }
s1 = sem_open("/s1", O_CREAT, 0022, 0);
if (s1 == 0) { perror("sem_open"); exit(1); }
s2 = sem_open("/s2", O_CREAT, 0022, 0);
if (s2 == 0) { perror("sem_open"); exit(1); }
int x, y, z;
sem_getvalue(s0, &x);
sem_getvalue(s1, &y);
sem_getvalue(s2, &z);
printf("%d %d %d\n", x, y, z);
pid_t pid = fork();
if (pid) {
pthread_create(&t1, NULL, threads, NULL);
pthread_detach(t1);
// Get start time and fire away
start = timeInMS();
sem_post(s2);
sem_post(s2);
// Wait for about a second
sleep(1);
// Stop thread
pthread_mutex_lock(&LOCK);
// Find out how much time has really passed. sleep won't guarantee me that
// I sleep exactly one second, I might sleep longer since even after being
// woken up, it can take some time before I gain back CPU time. Further
// some more time might have passed before I obtained the lock!
int64_t time = timeInMS() - start;
// Correct the number of thread switches accordingly
COUNTER = (uint32_t)(((uint64_t)COUNTER * 2 * 1000) / time);
printf("Number of process switches in about one second was %u\n", COUNTER);
printf("roughly %f microseconds per switch\n", 1000000.0 / COUNTER);
// clean up
kill(pid, 9);
wait(0);
sem_close(s0);
sem_close(s1);
sem_unlink("/s0");
sem_unlink("/s1");
sem_unlink("/s2");
} else {
if (1) { sem_t *t = s0; s0 = s1; s1 = t; }
threads(0); // never return
}
return 0;
}
https://assorted.svn.sourceforge.net/svnroot/assorted/sandbox/trunk/src/c/thread_switch_bench.c
// From <http://stackoverflow.com/questions/304752/how-to-estimate-the-thread-context-switching-overhead>
// on zs, ~4-5us/switch; tried making COUNTER updated only by one thread, but no difference
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/time.h>
uint32_t COUNTER;
pthread_mutex_t LOCK;
pthread_mutex_t START;
pthread_cond_t CONDITION;
void * threads (
void * unused
) {
// Wait till we may fire away
pthread_mutex_lock(&START);
pthread_mutex_unlock(&START);
int first=1;
pthread_mutex_lock(&LOCK);
// If I'm not the first thread, the other thread is already waiting on
// the condition, thus Ihave to wake it up first, otherwise we'll deadlock
if (COUNTER > 0) {
pthread_cond_signal(&CONDITION);
first=0;
}
for (;;) {
if (first) COUNTER++;
pthread_cond_wait(&CONDITION, &LOCK);
// Always wake up the other thread before processing. The other
// thread will not be able to do anything as long as I don't go
// back to sleep first.
pthread_cond_signal(&CONDITION);
}
pthread_mutex_unlock(&LOCK);
return 0;
}
int64_t timeInMS ()
{
struct timeval t;
gettimeofday(&t, NULL);
return (
(int64_t)t.tv_sec * 1000 +
(int64_t)t.tv_usec / 1000
);
}
int main (
int argc,
char ** argv
) {
int64_t start;
pthread_t t1;
pthread_t t2;
pthread_mutex_init(&LOCK, NULL);
pthread_mutex_init(&START, NULL);
pthread_cond_init(&CONDITION, NULL);
pthread_mutex_lock(&START);
COUNTER = 0;
pthread_create(&t1, NULL, threads, NULL);
pthread_create(&t2, NULL, threads, NULL);
pthread_detach(t1);
pthread_detach(t2);
// Get start time and fire away
start = timeInMS();
pthread_mutex_unlock(&START);
// Wait for about a second
sleep(1);
// Stop both threads
pthread_mutex_lock(&LOCK);
// Find out how much time has really passed. sleep won't guarantee me that
// I sleep exactly one second, I might sleep longer since even after being
// woken up, it can take some time before I gain back CPU time. Further
// some more time might have passed before I obtained the lock!
int64_t time = timeInMS() - start;
// Correct the number of thread switches accordingly
COUNTER = (uint32_t)(((uint64_t)COUNTER * 2 * 1000) / time);
printf("Number of thread switches in about one second was %u\n", COUNTER);
printf("roughly %f microseconds per switch\n", 1000000.0 / COUNTER);
return 0;
}
最佳答案
简单:pthread_mutex_lock() 在您的系统上大约需要 2 毫秒,您的线程版本每次通过循环需要两个锁,而进程版本只需要一个锁。
关于c - 微基准测试显示进程切换比线程切换更快;怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845723/
我正在阅读一些基准测试技巧,并在此站点上发现了一条提示“重新启动 MySQL 服务器以消除任何不需要的缓存因素”:http://blog.monitor.us/2012/09/the-gold-sta
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我在linux上测量cpu时间和排序算法的时间。我使用getrusage来测量cpu时间,并使用clock_gettime CLOCK_MONOTONIC来获取墙时间。尽管我注意到cpu时间大于墙上时
我可以阅读很多关于 OpenCL 的文章,它似乎是最有前途的(唯一的?)多架构库。 OpenCL应该是第一个并行架构编程标准,它最终会被大部分程序员采用。这很好,但是从 native 编程库迁移到 O
我想在不使用外部依赖项的情况下对一些 Lua 进行基准测试。我目前正在使用 os.clock: local function dummy() end local start = os.clock()
我对此很好奇。 我想检查哪个函数更快,所以我编写了一些代码并执行了很多次。 public static void main(String[] args) { long ts;
有没有办法在项目的开发阶段对 SQL 查询进行基准测试? 有问题的表中只有几个示例行,但我想在行数达到数千、数百万、数十亿、数万亿、数亿等等之前对一些查询进行基准测试 用数千行样本数据填充表格是唯一的
我正在尝试测量使用 rdtsc 执行函数“check()”所需的时间,如下所示: a = rdtsc(); check(pw); b = rdtsc(); return (b-a); 但是,我收到的时
我想在我的 Hadoop 集群上执行基准测试和性能测试。我知道 hadoop-mapreduce*test*.jar 和 hadoop-mapreduce-examples*.jar 有很多用于基准测
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这个现在非常常见的算法问题是在白板考试期间由监考人员提出的。我的工作是观察、倾听和客观判断给出的答案,但我无法控制这个问题,也无法与回答者互动。 给了五分钟的时间分析问题,考生可以写项目符号,伪代码(
我把代码从 http://www.bonto.ch/blog/2011/12/08/json-libraries-for-ios-comparison-updated/并在我的本地机器上进行了测试。
我正在尝试使用 MySQL 基准测试来测试一些查询。但是,我遇到了一个错误。 SELECT benchmark (10000, (select title from user)); 作为返回,我得到了
我很好奇这个。 我想检查哪个函数更快,所以我创建了一些代码并执行了很多次。 public static void main(String[] args) { long ts;
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我经常想比较同一函数的多个实现的运行时性能。对于个人输入,标准是一个很好的工具。 但是有什么简单的方法可以在不同的输入大小上绘制代码的性能,例如看算法复杂度? 理想情况下,我向库传递一个类型为 Ben
我有一系列旨在完成相同功能的功能。相同的输入产生相同的输出,但是执行这些输出所需的时间因功能而异。我想确定哪个是“最快”的,我想对自己的测量结果具有“统计学意义”有一定的信心。 细读Wikipedia
我想编写一个加载基准测试,它以编译时已知的步幅跨过给定的内存区域,并在该区域的末尾(2 的幂)使用尽可能少的非加载指令进行包装有可能。 例如,给定步长 4099,rdi 中的迭代计数以及 rsi 中指
我有多个组件与 RabbitMQ 相连。有些是生产者和消费者。我需要对我的系统进行基准测试/负载测试。我需要确保消费者每秒可以处理 N 条消息。我在互联网上做了一些搜索,但还没有真正找到任何东西。有没
是否有任何基准或研究来比较这两个 IDE --稳定性-- 开发人员生产力 - 特征 - 表现-- 等等 最佳答案 我是 Eclipse 用户(不是自愿的)。不确定稳定性,但性能方面 NetBeans
我是一名优秀的程序员,十分优秀!