- 配置
- 执行时间
- 源代码
- 其他
参数 | Windows | Linux |
---|---|---|
IDE | msvc2015 | g++ (GCC) |
版本 | 14.0.25420.01 Update3 | 11.2.0 |
编译器 | RELEASE x64 | |
C++版本 | c++11 | c++20 |
线程数 | Windows | Linux |
---|---|---|
10000 | 12647.3154ms | 959.823ms |
20000 | 44117.0524ms | 1831.181ms |
30000 | 92849.2460ms | 2803.997ms |
40000 | 164744.4306ms | DUMP |
- 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.0∗10−7n2+1.0∗10−4n
Linux下约为:
f 2 ( n ) = 9.0 ∗ 1 0 − 5 n f2(n) = 9.0*10^{-5}n f2(n)=9.0∗10−5n
#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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)