Calculating Time Elapsed

Hi,

I am using C#. I have timer running on my screen

I want to estimate the time left to complete the process

Can anyone helpme with the logic

I have no of records executed after each process and max no of records available.

I wish to calculate that how much records are executed in 1 min and estimated time left in completing all the records.

Can anyone help me with the logic?

Who is Participating?

Commented:
Here is an example:

static void Main()
{
const int n = 10;

DateTime start = DateTime.Now;

//Report Initial Status
Console.WriteLine("Complete: 0/" + n + ", Time Remaining: Unknown");

//Do Work (Part 1)

for (int i = 1; i < n; i++)
{
//Report Status
Console.WriteLine("Complete: " + i + "/" + n + ", Time Remaining: " + TimeRemaining(start, i, n));

//Do Work (Parts 2 through n)
}

//Report Final Status
Console.WriteLine("Complete: " + n + "/" + n + ", Time Remaining: 00:00:00");

}

static TimeSpan TimeRemaining(DateTime start, int complete, int total)
{
if (complete < 1 || complete > total)
throw new ArgumentException();

long elapsed = DateTime.Now.Subtract(start).Ticks;
double factor = (double)(total - complete) / (double)complete;

return new TimeSpan((long)(elapsed * factor));
}
0

Commented:
Actually, this is simpler!

static void Main()
{
const int n = 10;

DateTime start = DateTime.Now;

for (int i = 0; i < n; i++)
{
//Do Work

//Report Status
Console.WriteLine("Complete: " + (i + 1) + "/" + n + ", Time Remaining: " + TimeRemaining(start, i + 1, n));
}

}
0

Commented:
What is the range of possible record counts?
What is the range of time to process a single record?
0

Author Commented:
Thanks for all you are trying to help me.

I have calculated manually that my process process 400 records in a minute

but this depends on large and small records. So time estimate may vary time to time.

I have calculated time elapsed from the following method

private void timer1_Tick(object sender, EventArgs e)
{
seconds++;
TimeSpan ts = new TimeSpan(0, 0, seconds);
TimeSpanConverter tsc = new TimeSpanConverter();
lblTimer.Text = tsc.ConvertToString(ts);
}

My max records count can be 100000

and in while loop i am increasing count with count++

I will try above solutions and will come back. In the mean time, if someone has more simpler logic than please tell me the solutions

Thanking u
0

Author Commented:
Hi Expert1701,

Can u please tell me why u have written this method as static

static TimeSpan TimeRemaining(DateTime start, int complete, int total)
{
if (complete < 1 || complete > total)
throw new ArgumentException();

long elapsed = DateTime.Now.Subtract(start).Ticks;
double factor = (double)(total - complete) / (double)complete;

return new TimeSpan((long)(elapsed * factor));
}

cannot we write

public TimeSpan TimeRemaining(DateTime start, int complete, int total)
{
if (complete < 1 || complete > total)
throw new ArgumentException();

long elapsed = DateTime.Now.Subtract(start).Ticks;
double factor = (double)(total - complete) / (double)complete;

return new TimeSpan((long)(elapsed * factor));
}

Many Thanks
0

Author Commented:
Hi,

Your below solution works fine, Many thanks.

static TimeSpan TimeRemaining(DateTime start, int complete, int total)
{
if (complete < 1 || complete > total)
throw new ArgumentException();

long elapsed = DateTime.Now.Subtract(start).Ticks;
double factor = (double)(total - complete) / (double)complete;

return new TimeSpan((long)(elapsed * factor));
}

But I want my estimated time left in the format 00:00:00

But it is in

00:00:00.0000000

Also why u have written line

for how much time this will make my syetem sleep, 1 min or 1 sec

how much time is 1000

Hope to have your early response

0

Author Commented:

Can u please tell me why u have written this method as static

static TimeSpan TimeRemaining(DateTime start, int complete, int total)

cannot we write

public TimeSpan TimeRemaining(DateTime start, int complete, int total)

Thanks
0

Commented:
Hi dinesh_bali,

To answer your last open questions, you can leave the static keyword. Expert1701 just added it because he is calling it from a static method (main), and therefore he had to add the static keyword. So yes you can use:

public TimeSpan TimeRemaining(DateTime start, int complete, int total)

To use the format 00:00:00, you could change the code slightly:

for (int i = 1; i < n; i++)
{
//Report Status
string timeRemaining = TimeRemaining(start, i, n).ToString();
timeRemaining = timeRemaining.Substring(0, timeRemaining.IndexOf("."));
Console.WriteLine("Complete: " + i + "/" + n + ", Time Remaining: " + timeRemaining);

//Do Work (Parts 2 through n)
}

HTH,
Razzie
0

Commented:
dinesh_bali, I'm sorry I missed your replies - please assign the points to Razzie_ for this question.

If I can offer one more thing, maybe a function like the following would be appropriate given your use:

string TimeRemaining(DateTime start, int complete, int total)
{
if (complete < 1)
return "Unknown";
else if (complete >= total)
return "00:00:00";
else
{
long elapsed = DateTime.Now.Subtract(start).Ticks;
double factor = (double)(total - complete) / (double)complete;

TimeSpan remaining = new TimeSpan((long)(elapsed * factor));

return String.Format("{0:00}:{1:00}:{2:00}", (int)remaining.TotalHours, remaining.Minutes, remaining.Seconds);
}
}

0

Author Commented:
Hi,

But No- one has guided me that why we have used

If I use this, this will make my system more slower.

Is this neccassary to use.

Many Thanks
0

Commented:
Thread.Sleep(1000) is only used by Expert1701 to demonstrate what the code does. It makes the code perform slower so you can see what happen. If he would have omitted it, it would be hard for you to see what happens. So yes, you can leave the Thread.Sleep(1000) :)

And I do not agree with Expert1701 :P Though he missed your last questions, he provided you with the basic solution, so he should receive the larger amount of the points :)

HTH,
Razzie
0

Author Commented:

Kind Regards
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.