代码是用两个线程同时计算素数,再用单线程算一遍。
如果多个核都在运算,那么两个线程的版本应该在两个核上同时计算,这样会更早出结果。
验证代码如下:
#include <vector>
#include <algorithm>
#include <thread>
#include <iostream>
using namespace std;
#include <chrono>
using namespace std::chrono;
long long last_prime_test = 10000 * 3000;
bool is_prime(long long n)
{
for (long long i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
void test_is_prime(void)
{
vector<long long> arr{ 2,3,5,7,11,13,17,19 };
vector<long long> arr_get;
for (int i = 2; i < 20; i++)
{
if (is_prime(i))
{
arr_get.push_back(i);
}
}
if (std::equal(arr.begin(), arr.end(), arr_get.begin(), arr_get.end()))
{
cout << "is_prime is OK." <<endl;
}
else
{
cout << "is_prime is wrong!" << endl;
}
}
class c_timer
{
public:
double elapsed(void)
{
system_clock::time_point current_time = system_clock::now();
auto dur = current_time - m_start;
duration<double> second(dur);
return second.count()/* << " seconds\n"*/;
}
private:
system_clock::time_point m_start = system_clock::now();
};
void test_single_thread(void)
{
cout << "test_single_thread" << endl;
c_timer t;
int count_prime = 0;
//[2-last_prime_test]
for (long long i = 2; i <= last_prime_test; i++)
{
if (is_prime(i))
{
count_prime++;
}
}
cout << "[2-"<< last_prime_test<<"] has " << count_prime << " prime number."
<<" test cost time "<<t.elapsed()<<" seconds." << endl;
}
double g_cost = 0.0;
int g_count_prime = 0;
void total_prime_in_range(long long start, long long last)
{
c_timer t;
int count_prime = 0;
//[2-last_prime_test]
for (long long i = start; i <= last; i++)
{
if (is_prime(i))
{
count_prime++;
}
}
double cost = t.elapsed();
//g_cost += cost;//经“外行程序员”指正,这里不应该再累加
g_count_prime += count_prime;
cout << "["<<start<<" - " << last << "] has "
<< count_prime << " prime number."
<< " test cost time " << cost << " seconds." << endl;
}
void test_multi_thread(void)
{
cout << "test_multi_thread" << endl;
c_timer t;
std::thread t1(total_prime_in_range
, 2
, last_prime_test / 2);
std::thread t2(total_prime_in_range
, last_prime_test / 2 +1
, last_prime_test);
t1.join();
t2.join();
cout << "[" << 2 << " - " << last_prime_test << "] has "
<< g_count_prime << " prime number."
<< " test cost time " << t.elapsed() << " seconds." << endl;//经"外行程序员"指正,这里用t.elapsed()
}
int main()
{
test_is_prime();
//test_single_thread();
test_multi_thread();
return 0;
}
运行结果:
多线程耗时48秒:
单线程耗时78秒:
验证完毕。