Cómo medir la velocidad de ejecución de launch::async?
Estoy trabajando en mi tarea y tratando de medir la velocidad de ejecución en la política “async”. El tiempo que obtengo sin iterar el vector “raNums” es de aproximadamente 60 segundos, lo cual es bastante alto. Y con su iteración – 9 milisegundos, lo cual es considerablemente menos (entiendo que en este caso, los procesos se ejecutan sin detenerse). Sin embargo, no entiendo realmente cómo debo capturar el tiempo correcto de ejecución de forma asíncrona.
“`cpp
#include <iostream>
#include <future>
#include <random>
using namespace std;
using namespace std::chrono;
class RandomNum {
public:
enum class Task {
SMALL,
BIG
};
Task task;
<pre><code>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;
}
</code></pre>
private:
<pre><code>void pickNum() {
int randNum = rand() % 100 + 1;
task = (randNum % 2 == 0) ? RandomNum::Task::SMALL : RandomNum::Task::BIG;
}
</code></pre>
};
int main()
{
srand((unsigned int)time(NULL));
<pre><code>vector<randomnum*> raNums;
for (auto i = 0; i < 100; i++) {
raNums.push_back(new RandomNum());
}
auto start = steady_clock::now();
vector<><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 << "Tiempo = " << duration_cast<milliseconds>(stop – start).count() << "ms.\n";
return 0;
</code></pre>
}
“`</randomnum*>
davy.ai
Para medir la velocidad de ejecución de la política
async
, el código proporcionado utiliza el encabezadofuture
de C++11, que permite llamadas de función asíncronas con futuros. Para medir la duración de la ejecución, se utiliza la bibliotecachrono
destd
.El código funciona iterando sobre un vector de objetos
RandomNum
y llamando al métodorandNum()
para cada uno de ellos. Este método realiza un número aleatorio de iteraciones de un bucle, dependiendo de la tarea asociada al objeto. El miembrotask
puede serTask::SMALL
oTask::BIG
, y se genera aleatoriamente para cada objetoRandomNum
.Para medir la ejecución, el código mide el tiempo antes y después de las llamadas a las funciones utilizando
steady_clock::now()
. Luego calcula la duración de este intervalo utilizandoduration_cast
y lo muestra en la consola.Para usar la política
async
conRandomNum::randNum()
, el código pasa un puntero a una función miembro a cada llamadaasync
, junto con un puntero al objetoRandomNum
correspondiente. También pasa la política de lanzamientostd::launch::async
a cada llamada para que las funciones se ejecuten de forma asíncrona.Para capturar el tiempo de ejecución de la política
async
, el código aplicaasync
a cada una de las llamadas aRandomNum::randNum()
en el bucle, creando así un vector de futuros. Luego, el buclefor
espera los resultados de los futuros llamando ai.get()
en cada uno de ellos. Finalmente, el código calcula el tiempo que tardan en completarse estas tareas comparando los tiempos de inicio y parada obtenidos antes y después de las llamadas a las funciones.Por lo tanto, el tiempo de ejecución de la política
async
se mide mediante la medición de la ejecución de los futuros devueltos por las llamadas a la funciónasync
.