[英]How to measure the execution speed of launch::async?
我正在處理我的任務並嘗試測量async
策略的執行速度。 我沒有迭代raNums
向量的時間大約是 60 秒,這是相當多的。 並且它的迭代 - 9 毫秒,這是相當多的(我知道在這種情況下,進程會不停地進行)。 但是,我真的不明白我應該如何捕捉正確的異步執行時間?
#include <iostream>
#include <future>
#include <random>
using namespace std;
using namespace std::chrono;
class RandomNum {
public:
enum class Task {
SMALL,
BIG
};
Task task;
RandomNum() {
pickNum();
}
int randNum() {
if (task == RandomNum::Task::SMALL) {
for (int i = 0; i < 100; i++) {
rand();
}
}
else if (task == RandomNum::Task::BIG) {
for (int i = 0; i < 10000000; i++) {
rand();
}
}
return 0;
}
private:
void pickNum() {
int randNum = rand() % 100 + 1;
task = (randNum % 2 == 0) ? RandomNum::Task::SMALL : RandomNum::Task::BIG;
}
};
int main()
{
srand((unsigned int)time(NULL));
vector<RandomNum*> raNums;
for (auto i = 0; i < 100; i++) {
raNums.push_back(new RandomNum());
}
auto start = steady_clock::now();
vector<future<int>> res;
for (auto& value : raNums) {
//if (value->task == RandomNum::Task::SMALL) {
// res.push_back(async(launch::deferred, &RandomNum::randNum, value));
//}
//else {
// res.push_back(async(launch::async, &RandomNum::randNum, value));
//}
res.push_back(async(launch::async, &RandomNum::randNum, value));
}
for (auto& i : res) {
i.get();
}
auto stop = steady_clock::now();
cout << "Time = " << duration_cast<milliseconds>(stop - start).count() << "ms.\n";
return 0;
}
我有:
asynch
18 秒deferred
的 40 秒很容易理解, deferred
的所有事情都更長,因為單個線程可以完成所有事情。
由於我的計算機有 2 個超線程內核,因此async
速度大約是原來的兩倍是有道理的。
最后,通過混合兩者,它會更快一些,因為您避免了小函數的async
開銷。
話雖如此,您可能可以通過僅使用小型或大型任務測試有和沒有異步的時間來猜測更好的比率(在特定計算機上),以便更好地了解特定大小的改進。
事實上,對於 plot 來說,1、10、100、1000、10000 等直到 10000000 的圖表可能會很有趣。這樣,您可以更好地了解大小的影響以及使用任務的大小很有用。
作為參考,您可能還想通過僅生成隨機數來比較時間而不使用任務...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.