Разница во времени равна нулю во втором расчете деления в c # - PullRequest
2 голосов
/ 14 декабря 2011

Мне нужно наиболее точно рассчитать разницу во времени для деления в нано секундах. Пожалуйста, скажи мне сделать это.

В настоящее время я использую метод с более низкой точностью, в котором проблема заключается в том, что: при выполнении первого вычисления он показывает 87 миллисекунды или 65 миллисекунды в качестве ответа. Но когда функция вызывается снова во второй или более раз, она показывает только 0 миллисекунд.

Код:

long startTick = DateTime.Now.Ticks;
double result = (double)22 / 7;
result = System.Math.Round(result, digit);                
long endTick = DateTime.Now.Ticks; 
long tick = endTick - startTick;
double milliseconds = tick / TimeSpan.TicksPerMillisecond;
time.Text = result + "\nThe division took " + milliseconds + " milliseconds to complete.";

цифра - это параметр функции, который является переменным. Независимо от того, какое значение цифры является значением в миллисекундах, оно остается 0 после первого вызова функции ....

Пожалуйста, предложите более точный способ, которым вызов одной и той же функции с другим decimal digits приведет к другому интервалу времени в c # для Windows Phone.

Я думаю, что очистка памяти должна выполняться до и после каждого расчета. Но я не знаю, как это сделать.

Мне не нравится этот тиковый метод лично для точности. Я пробовал секундомер также, но он не работает. Пожалуйста, предложите другой метод, который лучше всего подходит в моем случае. Я хочу результат, как: 0,0345 или 0,0714 секунд.

Спасибо

Ответы [ 4 ]

4 голосов
/ 14 декабря 2011

Вы выполняете целочисленное деление в этой строке:

double milliseconds = tick / TimeSpan.TicksPerMillisecond;

Даже если вы объявляете его как двойное, long, деленное на long, усекает десятичную дробь.Вам лучше делать:

double milliseconds = (double)tick / TimeSpan.TicksPerMillisecond;

Или еще лучше, просто отбросьте все галочки вместе:

DateTime start = DateTime.Now;
double result = (double)22 / 7;
result = System.Math.Round(result, digit);                
DateTime end = DateTime.Now;
double milliseconds = (end - start).TotalMilliseconds;
time.Text = result + "\nThe division took " + milliseconds + " milliseconds to complete.";

Вы не сможете получить точность на микро или нано уровне,но вы получите точность в миллисекундах с погрешностью.

Однако вы все же можете получить ноль.Вы пытаетесь определить, сколько времени займет простая операция деления.Вы можете сделать миллионов операций деления менее чем за секунду.Возможно, вы захотите сделать это 1 000 000 раз, а затем разделите результат на 1 000 000:

DateTime start = DateTime.Now;
for (var i = 0; i < 1000000; i++)
{
    double result = (double)22 / 7;
    result = System.Math.Round(result, digit);
}
DateTime end = DateTime.Now;
double milliseconds = (end - start).TotalMilliseconds / 1000000;

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

0 голосов
/ 14 декабря 2011

// если вы хотите получить полные миллисекунды, вы можете сделать что-то вроде этого.

dateStartTime = Convert.ToDateTime(DateTime.Now.TimeOfDay.ToString());
//then where you end the code do this
dateEndTime = Convert.ToDateTime(DateTime.Now.TimeOfDay.ToString());
ddateDuration = (TimeSpan)(dateEndTime - dateStartTime);
then to display out what you are actually looking for in terms of miliseconds do
Console.WriteLine(ddateDuration.ToString().Substring(0, 8)); 
// or some other method that you are using to display the results
0 голосов
/ 14 декабря 2011

Почему вы не используете класс StopWatch для расчета времени. Он предназначен для расчета времени, которое вы хотите .. Вот ссылка для вашей справки.

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

0 голосов
/ 14 декабря 2011

Поскольку у вас есть время в тиках, просто увеличьте разрешение, умножив знаменатель:

double microseconds = tick / (TimeSpan.TicksPerMillisecond * 1000.0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...