2016-08-16 2 views
1

Я запускаю пару потоков параллельно. И я хочу измерить время, необходимое для выполнения одного потока, и времени, которое требуется для выполнения всей программы. Я использую VC++, на Windows 7.Как измерить время выполнения одного потока?

Я пытался измерить его во время отладки, но потом я увидел этот вопрос: https://stackoverflow.com/questions/38971267/improving-performance-using-parallelism-in-c?noredirect=1#comment65299718_38971267 и в ответ дается Schnien он говорит:

Debugging of multiple threads is somehow "special" - when your Debugger halts at a breakpoint, the other threads will not be stopped - they will go on 

ли это? И если да, то как я могу иначе измерить время

Благодаря

+0

Использование встроенной Profiler или параллелизмом визуализатора: https://msdn.microsoft.com/en-us/ библиотека/dd537632.aspx – Mars

ответ

2

Это утверждение действительно верно, только поток, который попадает в точку останова будет приостановлена.

Однако для измерения времени выполнения вам вообще не нужно использовать отладку. Более подробную информацию по измерению времени выполнения можно найти на вопрос ниже:

Measure execution time in C (on Windows)

То, что вы хотели бы сделать, это измерить время внутри функций Резьбы (путем вычитания времени в начале и в конце функций). Вы можете сделать то же самое с программой, вы можете использовать thread.join, чтобы убедиться, что все потоки выполняются перед измерением времени в последний раз.

1

Используйте простой класс таймера для создания возможности секундомера, а затем запишите время в каждом потоке. Кроме того, создание системных потоков происходит медленнее, чем использование std::async, и последнее может как возвращать значения, так и распространять исключения, которые, используя потоки, вызывают завершение программы, если они не попадают в поток.

#include <thread> 
#include <iostream> 
#include <atomic> 
#include <chrono> 
#include <future> 

// stopwatch. Returns time in seconds 
class timer { 
public: 
    std::chrono::time_point<std::chrono::high_resolution_clock> lastTime; 
    timer() : lastTime(std::chrono::high_resolution_clock::now()) {} 
    inline double elapsed() { 
     std::chrono::time_point<std::chrono::high_resolution_clock> thisTime=std::chrono::high_resolution_clock::now(); 
     double deltaTime = std::chrono::duration<double>(thisTime-lastTime).count(); 
     lastTime = thisTime; 
     return deltaTime; 
    } 
}; 

// for exposition clarity, generally avoid global varaibles. 
const int count = 1000000; 

double timerResult1; 
double timerResult2; 

void f1() { 
    volatile int i = 0; // volatile eliminates optimization removal 
    timer stopwatch; 
    while (i++ < count); 
    timerResult1=stopwatch.elapsed(); 
} 
void f2() { 
    volatile int i = 0; // volatile eliminates optimization removal 
    timer stopwatch; 
    while (i++ < count); 
    timerResult2=stopwatch.elapsed(); 
} 

int main() 
{ 
    std::cout.precision(6); std::cout << std::fixed; 
    f1(); std::cout << "f1 execution time " << timerResult1 << std::endl; 
    timer stopwatch; 
    { 
     std::thread thread1(f1); 
     std::thread thread2(f2); 
     thread1.join(); 
     thread2.join(); 
    } 
    double elapsed = stopwatch.elapsed(); 
    std::cout << "f1 with f2 execution time " << elapsed << std::endl; 
    std::cout << "thread f1 execution time " << timerResult1 << std::endl; 
    std::cout << "thread f1 execution time " << timerResult2 << std::endl; 
    { 
     stopwatch.elapsed(); // reset stopwatch 
     auto future1 = std::async(std::launch::async, f1); // spins a thread and descturctor automatically joins 
     auto future2 = std::async(std::launch::async, f2); 
    } 
    elapsed = stopwatch.elapsed(); 
    std::cout << "async f1 with f2 execution time " << elapsed << std::endl; 
    std::cout << "async thread f1 execution time " << timerResult1 << std::endl; 
    std::cout << "async thread f1 execution time " << timerResult2 << std::endl; 
} 

На моей машине создания нитей добавляет около 0,3 мс на поток, тогда как асинхронная составляет лишь около 0,05 мс в потоке, как это реализовано с помощью пула потоков.

f1 execution time 0.002076 
f1 with f2 execution time 0.002791 
thread f1 execution time 0.002018 
thread f1 execution time 0.002035 
async f1 with f2 execution time 0.002131 
async thread f1 execution time 0.002028 
async thread f1 execution time 0.002018 

[EDIT] Если бы неправильные F вызовы перед выписок (вырезать и прошлые ошибки)

Смежные вопросы