Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Measuring the execution time in multithreading environment

I have an application that uses Task (TPL) objects for asynchronous execution.

The main thread waits for a trigger (some TCP packet) and then executes several tasks. What I want to do is to measure the time spent in the tasks.

Take a look at the code. I have some lengthy operation (Generator), enclosed in Stopwatch's start/stop.

Task.Factory.StartNew((t) => {

    Stopwatch sw = new Stopwatch();
    sw.Start();

    Generator g = new Generator();
    g.GenerateIntervals(); // lengthy operation

    sw.Stop();
    GlobalStopwatch.Add(sw.Elapsed);
});

Here is the problem. Stopwatch uses DateTime.UtcNow.Ticks at the moment of Start() and then again at the moment of Stop(). Then it subtracts those two to get the elapsed time.

The thing is, some other thread (in a single-threaded system) can get some processor time while the Generator (from the code) is doing its GenerateIntervals() lengthy operation. That means that the elapsed time recorded by the stopwatch would contain not only the Generaor.GenerateIntervals() time, but also the time that the other threads did their job inbetween.

Is there any simple way to know exactly how much of processor time did some method take, not including execution time from other threads as a result of timesharing mechanisms?

like image 567
Kornelije Petak Avatar asked Dec 12 '11 14:12

Kornelije Petak


People also ask

How do you calculate thread execution time?

There are two ways to measure elapsed execution time in Java either by using System. currentTimeinMillis()or by using System. nanoTime(). These two methods can be used to measure elapsed or execution time between two method calls or events in Java.

What is multithreaded execution?

Multithreading is a model of program execution that allows for multiple threads to be created within a process, executing independently but concurrently sharing process resources. Depending on the hardware, threads can run fully parallel if they are distributed to their own CPU core.

How does multithreading save time?

The second thread creates more overhead than it can make up for, and so the process overall slows down. On a multicore machine, you have two physical executors...which means the second thread gets an entire new core to work with. This means that it doesn't have to compete with as many other things for execution time.

How much faster is multithreading?

Multithreading is always faster than serial. Dispatching a cpu heavy task into multiple threads won't speed up the execution. On the contrary it might degrade overall performance. Imagine it like this: if you have 10 tasks and each takes 10 seconds, serial execution will take 100 seconds in total.


2 Answers

The answer to your question is "No"... No, you cannot measure the accumulated time ON THE CPU for a particular thread.

(Side-rant: I really wish people would read the question and understand it before answering!!!)

Ok, back to your question... the most accurate thing you could do would be to spin off a separate process for each of your tasks, and then measure the CPU time for the process (which can be done in .Net)... but that's overkill.

If you need help on how to do that, you should ask another question specifically for that.

like image 111
Timothy Khouri Avatar answered Oct 20 '22 01:10

Timothy Khouri


Here is nice Article . You can use it or you can compare those times using in-built performance analyzer in VS2010.

like image 43
Sampath Avatar answered Oct 20 '22 01:10

Sampath