【发布时间】:2012-01-16 17:03:13
【问题描述】:
我正在一个 arm imx27 板上进行 Windows CE 和 Linux 之间的性能评估。该代码已经为 CE 编写,并测量了执行不同内核调用所需的时间,例如使用互斥锁和信号量等操作系统原语、打开和关闭文件以及网络。
在将此应用程序移植到 Linux (pthreads) 期间,我偶然发现了一个我无法解释的问题。几乎所有测试都显示性能从 5 倍提高到 10 倍,但不是我的 win32 events 版本(SetEvent 和 WaitForSingleObject),CE 实际上“赢得”了这个测试。
为了模拟我使用 pthreads 条件变量的行为(我知道我的实现并没有完全模拟 CE 版本,但对于评估来说已经足够了)。
测试代码使用两个线程,它们使用事件相互“乒乓”。
Windows 代码:
线程 1:(我测量的线程)
HANDLE hEvt1, hEvt2;
hEvt1 = CreateEvent(NULL, FALSE, FALSE, TEXT("MyLocEvt1"));
hEvt2 = CreateEvent(NULL, FALSE, FALSE, TEXT("MyLocEvt2"));
ResetEvent(hEvt1);
ResetEvent(hEvt2);
for (i = 0; i < 10000; i++)
{
SetEvent (hEvt1);
WaitForSingleObject(hEvt2, INFINITE);
}
线程 2:(只是“响应”)
while (1)
{
WaitForSingleObject(hEvt1, INFINITE);
SetEvent(hEvt2);
}
Linux 代码:
线程 1:(我测量的线程)
struct event_flag *event1, *event2;
event1 = eventflag_create();
event2 = eventflag_create();
for (i = 0; i < 10000; i++)
{
eventflag_set(event1);
eventflag_wait(event2);
}
线程 2:(只是“响应”)
while (1)
{
eventflag_wait(event1);
eventflag_set(event2);
}
我对@987654331@的实现:
struct event_flag* eventflag_create()
{
struct event_flag* ev;
ev = (struct event_flag*) malloc(sizeof(struct event_flag));
pthread_mutex_init(&ev->mutex, NULL);
pthread_cond_init(&ev->condition, NULL);
ev->flag = 0;
return ev;
}
void eventflag_wait(struct event_flag* ev)
{
pthread_mutex_lock(&ev->mutex);
while (!ev->flag)
pthread_cond_wait(&ev->condition, &ev->mutex);
ev->flag = 0;
pthread_mutex_unlock(&ev->mutex);
}
void eventflag_set(struct event_flag* ev)
{
pthread_mutex_lock(&ev->mutex);
ev->flag = 1;
pthread_cond_signal(&ev->condition);
pthread_mutex_unlock(&ev->mutex);
}
还有struct:
struct event_flag
{
pthread_mutex_t mutex;
pthread_cond_t condition;
unsigned int flag;
};
问题:
- 为什么我在这里看不到性能提升?
- 可以采取哪些措施来提高性能(例如,是否有更快的方法来实施 CE 行为)?
- 我不习惯编写 pthread 编码,我的实现中是否存在可能导致性能损失的错误?
- 是否有任何替代库可以解决这个问题?
【问题讨论】:
-
你可以检查这个实现 stackoverflow.com/questions/178114/… 。购买不要期望性能有任何提高。 Linux simple 本身不支持事件之类的东西,仿真永远不会这么快。这与 Windows 中的条件变量相同。旧的 windows 版本不支持它,模拟也相当复杂。
-
@Zuljin:那里的实现与我的版本几乎相同。 :-(
-
不能用其他原语实现吗?
-
我所做或看到的所有测试都让 CE 轻松赢得同步对象,所以你的结果是我所期望的。但是,您可能会发现 Linux 的网络堆栈比 CE 快得多(我最后一次测试肯定是这样)。
标签: windows linux events pthreads windows-ce