Расчет расчетного оставшегося времени в цикле (когда номер итерации очень большой и время, необходимое для каждой итерации, очень мало) - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь рассчитать общее время, оставшееся до цикла.Общее количество итераций может быть больше ~ 1010000000.Общее время, необходимое для выполнения «Настоящей работы здесь», намного меньше секунды, и оно мало что меняет.Когда я использую свое текущее решение, оставшееся время решения увеличивается в течение длительного времени, а затем начинает уменьшаться.

Я ищу лучшее решение.Что я могу сделать?

long totalTiles = ((((rightBottom.X) - (topLeft.X)) + 1) * (((rightBottom.Y) - (topLeft.Y)) + 1));
long currentTileProccessed = 0;

DateTime startTime = DateTime.Now;

for (long x = (topLeft.X); x <= (rightBottom.X); x++)
{
    for (long y = (topLeft.Y); y <= (rightBottom.Y); y++)
    {
        **//Real job done here//**

        TimeSpan timeRemaining = TimeSpan.FromTicks(DateTime.Now.Subtract(startTime).Ticks * (totalTiles - (currentTileProccessed + 1)) / (currentTileProccessed + 1));

        this.Dispatcher.Invoke((Action)delegate () {
            EstimatedTimeLeft_TextBlock.Text = "Days : " + timeRemaining.Days.ToString("D2") + ", Hours : " + timeRemaining.Hours.ToString("D2") + ", Minutes :" + timeRemaining.Minutes.ToString("D2") + ", Seconds :" + timeRemaining.Seconds.ToString("D2");
        });

        currentTileProccessed++;
    }
}

1 Ответ

0 голосов
/ 10 декабря 2018

Здесь я использую секундомер из System.Diagnostics для определения среднего времени для последних 100 задач, которое я умножаю на общее ожидаемое количество задач минус число уже запущенных.

ПРИМЕЧАНИЕ. Оставшееся время можетпродолжает увеличиваться, если вдруг последние 100 задач начнут выполняться медленнее, чем предыдущие 10 Кб, это перенастроит оставшееся время, чтобы соответствовать последним запускам.

long totalTiles = ((((rightBottom.X) - (topLeft.X)) + 1) * (((rightBottom.Y) - (topLeft.Y)) + 1));
long currentTileProccessed = 0;

Queue<long> taskTimes = new Queue<long>();
int taskTimeHistoryLimit = 100;

long taskTotal = (rightBottom.X - topLeft.X) * (rightBottom.Y - topLeft.Y);

Stopwatch watch = new Stopwatch();


long index = 0;
for (long x = (topLeft.X); x <= (rightBottom.X); x++)
{
    for (long y = (topLeft.Y); y <= (rightBottom.Y); y++)
    {
        index++;
        watch.Start();
        //Real job done here//
        watch.Stop();
        taskTimes.Enqueue(watch.ElapsedTicks);
        watch.Reset();
        while (taskTimes.Count > taskTimeHistoryLimit)
        {
            taskTimes.Dequeue();
        }
        TimeSpan timeRemaining = new TimeSpan((taskTotal - index) * (long)taskTimes.Average());

        this.Dispatcher.Invoke((Action)delegate () {
            EstimatedTimeLeft_TextBlock.Text = "Days : " + timeRemaining.Days.ToString("D2") + ", Hours : " + timeRemaining.Hours.ToString("D2") + ", Minutes :" + timeRemaining.Minutes.ToString("D2") + ", Seconds :" + timeRemaining.Seconds.ToString("D2");
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...