一次简单的Windows和Linux多线程效率测试

一次简单的Windows和Linux多线程效率测试,第1张

一次简单的Windows和Linux多线程效率测试
  • 配置
  • 执行时间
  • 源代码
  • 其他

配置
参数WindowsLinux
IDEmsvc2015g++ (GCC)
版本14.0.25420.01 Update311.2.0
编译器RELEASE x64
C++版本c++11c++20
执行时间
线程数WindowsLinux
1000012647.3154ms959.823ms
2000044117.0524ms1831.181ms
3000092849.2460ms2803.997ms
40000164744.4306msDUMP
  • Linux系统下跑的太快了,四万个线程直接挂了,三万个线程能正常跑完,推测上限值在 2 15 = 32767 2^{15} = 32767 215=32767 左右;
  • 假设线程数为n,这些线程的执行时间都非常短,且n不超过当前 *** 作系统的最大线程数
    则完成这些线程的时间(单位:s):
    windows下约为:
    f 1 ( n ) = 1.0 ∗ 1 0 − 7 n 2 + 1.0 ∗ 1 0 − 4 n f1(n) = 1.0*10^{-7}n^2+1.0*10^{-4}n f1(n)=1.0107n2+1.0104n
    Linux下约为:
    f 2 ( n ) = 9.0 ∗ 1 0 − 5 n f2(n) = 9.0*10^{-5}n f2(n)=9.0105n
源代码
#include
#include
#include

#include
#include
#include
#include
#include

using namespace std;

static auto __x=[]
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    return 0;
};

typedef unsigned int UINT;

atomic_int ct=0;
#define MAX_THREAD 30000

int main()
{    
#ifndef _WIN32
    timeval begin;
    gettimeofday(&begin,nullptr);
#else
    //time_t begin=clock();
    long long freq=_Query_perf_frequency();
    long long begin=_Query_perf_counter();
#endif
    auto fun=[&]{++ct;};
    std::vector<std::thread> ths;
    ths.reserve(MAX_THREAD);
    for(UINT i=0;i<MAX_THREAD;++i)
    {
        std::thread th(fun);
        ths.push_back(std::move(th));
    }
    for(std::thread &th:ths)
    {
        th.join();
    }
    
#ifndef _WIN32
    timeval end;
    gettimeofday(&end,nullptr);
    long dus=(end.tv_sec-begin.tv_sec)*1000000+(end.tv_usec-begin.tv_usec);
#else
    //time_t end=clock();   
    long long end=_Query_perf_counter();
    long long dus=end-begin;
#endif
    printf("%u\n",ct.load());
    printf("%ld\n",dus);
    
    return 0;
}
其他

g++编译命令行

g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564240.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存