我正在創建一個使用 100 個亂數生成器的 C 程式。數字生成器分為兩組:一組創建 100 個數字,一組創建 10 000 000 個數字。
我試圖看到以下之間的區別:
- 對 100 個號碼使用延遲啟動,對 10 000 000 個號碼使用異步。
- 僅對兩種型別的數字生成器使用異步。
時間上沒有區別,所以我的代碼有問題,但到目前為止我還沒有找到它,因為我是C 的初學者。
下面是代碼。我已經評論了僅使用異步的部分。
#include <iostream>
#include <chrono>
#include <future>
#include <list>
/*
Using both deferred and async launchings: 5119 ms
Using only async launching: 5139 ms
*/
using namespace std;
class RandomNumberGenerator
{
public:
enum class task { LIGHT, HEAVY };
task taskType;
RandomNumberGenerator(): taskType(task::LIGHT)
{
int rnd = rand() % 2;
if (rnd == 0)
{
taskType = task::LIGHT;
}
else
{
taskType = task::HEAVY;
}
}
bool generateNumbers()
{
int number;
if(taskType == task::LIGHT)
{
for (int i = 0; i < 100; i )
{
number = rand();
}
}
else
{
for (int i = 0; i < 1000000; i )
{
number = rand();
}
}
return true;
}
};
int main()
{
cout << "Starting to generate numbers\n";
RandomNumberGenerator objects[100];
auto start = chrono::system_clock::now();
for (int i = 0; i < 100; i )
{
objects[i].generateNumbers();
future<bool> gotNumbers;
if (objects[i].taskType == RandomNumberGenerator::task::LIGHT)
{
gotNumbers = async(launch::deferred, &RandomNumberGenerator::generateNumbers, &objects[i]);
}
else
{
gotNumbers = async(launch::async, &RandomNumberGenerator::generateNumbers, &objects[i]);
}
bool result = gotNumbers.get();
//future<bool> gotNumbers = async(launch::async, &RandomNumberGenerator::generateNumbers, &objects[i]);
//bool result = gotNumbers.get();
}
auto end = chrono::system_clock::now();
cout << "Total time = " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << " seconds\n";
}
uj5u.com熱心網友回復:
使用launch::deferred或launch::async同樣數量的作業仍然需要完成唯一的區別是它是否在另一個執行緒上完成并且當前執行緒在您呼叫時阻塞等待該執行緒完成,gotNumbers.get()或者當您呼叫時是否直接在當前執行緒中計算結果打電話gotNumbers.get()。無論哪種方式,您都不會通過使用額外的執行緒獲得任何性能,因為一次只有一個執行緒在執行。
如果您在呼叫之前開始執行異步作業,objects[i].generateNumbers()您可能會看到更多差異(盡管 std::async 的開銷可能仍然超過性能提升)。
#if 1
future<bool> gotNumbers;
if ( objects[ i ].taskType == RandomNumberGenerator::task::LIGHT )
{
gotNumbers = async( launch::deferred, &RandomNumberGenerator::generateNumbers, &objects[ i ] );
}
else
{
gotNumbers = async( launch::async, &RandomNumberGenerator::generateNumbers, &objects[ i ] );
}
#else
future<bool> gotNumbers = async(launch::async, &RandomNumberGenerator::generateNumbers, &objects[i]);
#endif
objects[ i ].generateNumbers();
bool result = gotNumbers.get();
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/344617.html
