繁体   English   中英

串行代码比在C语言中仅使用一个线程慢得多?

[英]Serial code much slower than using only one thread in C?

因此,我正在使用线程进行一些基准测试,并编写了以下代码:

resp_threadless []和resp_threaded []是全局int数组,其大小为n;

int n = 100000;

void function() {
  for (long j = 0; j < n; ++j) {
    int count = 0;
    double x = vetor[j];
      while (x > 1.0) {
      x = sqrt(x);
      ++count;
    }
   resp_threadless[j] = count;
  }
}

DWORD WINAPI function_th( LPVOID lpParam ) {
for (long j = 0; j < n; ++j) {
    int count = 0;
    double x = vetor[j];
      while (x > 1.0) {
      x = sqrt(x);
      ++count;
    }
   resp_threadless[j] = count;
  }
}

我通过打电话给她来对第一个功能进行基准测试:

function();

第二个是这样的:

HANDLE hThreadArray[1];
DWORD dwThreads[1];
hThreadArray[0] = CreateThread(NULL, 0, function_th, NULL , 0, &(dwThreads[0]));
WaitForMultipleObjects(1, hThreadArray, TRUE, INFINITE);
CloseHandle(hThreadArray[0]);

请记住,我知道使用function_th()调用多个线程不会并行化它,这只是一个测试,因为我的结果确实很奇怪,所以我决定看看使用SAME代码的一个线程和一个函数会发生什么。

我在Intel Atom N270和NUMPROC = 1的Windows XP上进行了测试。

结果:序列号:1485 ms一个线程:425 ms

使用多处理器机器,甚至使用信号量来并行化线程完成的工作的代码,我都有类似的结果。

有谁知道会发生什么事吗?

编辑

颠倒顺序,一次运行多次,等等...->不变

N更高->线程一按比例甚至更快

使用QueryPerformanceCounter()->不变

线程创建开销->应该使线程更慢,而不是更快

原始代码: http//pastebin.com/tgmp5p1G

这是cache hit问题。 我怀疑您按照问题描述的顺序进行了基准测试。 首先调用该函数,然后调用该线程。 当您对此进行更详细的基准测试时,您将观察到以下原因:数据(sqrt)在高速缓存中可用,因此代码执行得更快。 测试以证明:

  1. 在调用线程之前,请运行function()两次,甚至更多次。 第二次调用function将已经给出更快的结果。
  2. 在函数之前调用线程,结果将相反。 该功能将显示更好的结果。

原因:所有sqrt计算(或至少很多)都可以在缓存中使用,而不必重新计算。 那快很多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM