c++ - 使用简单程序的慢速多线程

标签 c++ multithreading performance

我正在尝试使用多线程(之前没有经验),并且有一个简单的函数通过两个单独的线程从 int main 调用,该线程仅在 2 个 for 循环中更改(并创建)一个变量。据我所知,这两个线程之间没有依赖关系,但是运行一个线程时我的时间是 2.29 秒,而运行两个线程时时间是 7.11 秒(我预计是 3-4 秒)。

我在带有两个 Intel atom CPU (Ubuntu 10.04) 的上网本上运行 - 我知道两个线程都不会获得单个 CPU 的完整“所有权”,因为 int main() 进程本身涉及一个线程(连同无论操作系统需要什么),但我对性能下降感到震惊(大概是线程切换!?)

有什么方法可以改进这里吗? (或许可以减少 CPU 在线程之间跳转所要做的工作)。我希望尽快做一些更丰富的事情(使用轮分解进行主要筛选,其中不同的线程拥有不同的辐条)但我对我现在获得的性能印象不太深刻

我现在的简单代码如下:

#include <iostream>"
#include <ctime>
#include <pthread.h>


void* foo(void* dummyVar)
{
    for(int i=1; i < 10; i++)
    {
        for(int j=1; j < 50000000; j++)
        {
            int test = j;
        }
            std::cout << i << "\n";
    }
    pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
    clock_t start = clock();
    pthread_t thread1;
    pthread_t thread2;
    pthread_attr_t attribute;
    void* status;
    pthread_attr_init(&attribute);
    pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_JOINABLE);
    int i = 0;
    int b = pthread_create(&thread1, NULL, foo, (void*)i);
    int c = pthread_create(&thread2, NULL, foo, (void*)i);
    pthread_join(thread1, &status);
    pthread_join(thread2, &status);

    std::cout << ((double)clock() - start) / CLOCKS_PER_SEC << "\n";
    return 0;
}

更新:通过让与 main() 关联的线程在另一个线程也调用 foo 之后调用 foo(而不是两个线程),我获得了更好的性能(很明显!),尽管多线程在这台机器上仍然较慢(已经foo 的一些变化 - 现在只有一个 for 循环 - 时间是 5.17 vs 6.01)

最佳答案

    for(int j=1; j < 50000000; j++)
    {
        int test = j;
    }

适当的基准测试可以是一门艺术,但这个很快就会落空。这段代码生存的唯一方法是忘记打开优化器。这在任何体面的编译器上都会完全消除循环,因为它没有有用的副作用。

假设你确实打开了优化器,你实际上测量了 10 次

  std::cout << i << "\n";

一个永远不能并发运行的语句,线程将争夺序列化访问终端/控制台的锁。预期的结果是这确实会更慢。

但很有可能您忘记了优化器,永远不要在没有打开优化器的情况下分析代码,否则您将无法以这种方式发布它。

关于c++ - 使用简单程序的慢速多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671901/

相关文章:

C++ 打印到终端会显着减慢代码速度吗?

c++ - 写同步读成功

C++ 方法扩展

c++ - 调试和发布版本之间的 QTextBrowser 行为不同

c++ - 复制 QMimeData 对象的正确方法

c++ - 从不同线程写入 boost::asio 套接字

java - 从线程中的 Pixmap 对象创建纹理时,纹理为空

java - 了解 AsyncTask 是否正在运行

python - 为什么创建一个小数组然后扩展它比完全从一个大列表创建一个数组更有效率?

c++ - 从 int** 到 const int** 的无效转换