void* worker(void*)
{
int clk = clock();
float val = 0;
for(int i = 0; i != 100000000; ++i)
{
val += sin(i);
}
printf("val: %f\n", val);
printf("worker: %d ms\n", clock() - clk);
return 0;
}
int main()
{
pthread_t tid;
pthread_create(&tid, NULL, worker, NULL);
int clk = clock();
float val = 0;
for(int i = 0; i != 100000000; ++i)
{
val += sin(i);
}
printf("val: %f\n", val);
printf("main: %d ms\n", clock() - clk);
pthread_join(tid, 0);
return 0;
}
主线程和工作线程应该运行同样快,但结果是:
val: 0.782206
worker: 5017 ms
val: 0.782206
main: 8252 ms
主线程慢得多,我不知道为什么......
问题解决了。这是编译器的问题,GCC(MinGW)在Windows上表现得很奇怪。 我在Visual Studio 2012中编写了代码,没有速度差异。
答案 0 :(得分:1)
Main thread and the worker thread are supposed to run equally fast, but the result is:
我从未在实时操作系统之外看到过提供此类保证的线程系统。对于桌面系统中的Windows线程和所有其他线程系统(我也使用posix线程,以及MacOS X上的轻量级线程,以及C#线程中的线程),我的理解是没有性能保证或速度快一个线程将与另一个线程相关。
一个可能的解释(推测)可能是因为你使用的是现代四核,它可能会提高主核心的时钟频率。当大多数单线程工作负载时,现代i5 / i7 / AMD-FX系统将一个核心的时钟速率提高到预先评级的水平,即库存冷却可以消散热量。在更多并行工作负载上,所有内核的时钟速度都会有较小的提升,同样会根据散热情况进行预先评估,而在空闲时,所有内核都会被节流以最大限度地降低功耗。背景工作量可能主要在单个核心上执行,第二个线程在第二个核心上花费的时间量不足以证明切换到所有核心速度提升的模式是合理的。
我会再尝试使用4个线程和10倍的工作负载。如果你有一个监视CPU负载和时钟速度的工具,我会检查。使用该信息,您可以推断出我是对还是错。
另一种选择可能是剖析并查看工作的哪一部分需要时间。操作系统调用可能比工作负载花费更多时间。
您还可以在另一台具有不同性能特征的机器上测试您的软件,例如稳定的时钟速度或单核心。这将提供更多信息。
答案 1 :(得分:0)
可能发生的是工作线程执行与main的执行交错,因此一些工作线程的执行时间正在计算主时间。您可以尝试在工作的最开始处放置sleep(10)
(比工作者和主要运行时大一些时间)并再次运行。