我正在对arm imx27板上的Windows CE和Linux进行性能评估。CE的代码已经编写完成,可以测量执行不同内核调用(如使用互斥体和信号量等操作系统原语、打开和关闭文件以及网络)所需的时间。
在将此应用程序移植到Linux(pthreads)期间,我遇到了一个无法解释的问题。几乎所有的测试都显示了5到10倍的性能提升,但我的 win32 events 版本(
为了模拟行为,我使用了pthread条件变量(我知道我的实现并不能完全模拟CE版本,但对于评估来说已经足够了)。
测试代码使用两个线程,它们使用事件进行“乒乓”。
在将此应用程序移植到Linux(pthreads)期间,我遇到了一个无法解释的问题。几乎所有的测试都显示了5到10倍的性能提升,但我的 win32 events 版本(
SetEvent
和 WaitForSingleObject
)却没有,实际上CE在这个测试中获胜了。为了模拟行为,我使用了pthread条件变量(我知道我的实现并不能完全模拟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);
}
我对 eventflag_*
的实现:
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 event_flag
{
pthread_mutex_t mutex;
pthread_cond_t condition;
unsigned int flag;
};
问题:
- 为什么我在这里看不到性能提升?
- 有什么方法可以提高性能(例如,是否有更快的实现CEs行为的方法)?
- 我不习惯编写pthread,我的实现中可能存在错误导致性能损失吗?
- 还有其他替代库吗?