Как Windows определяет, сколько времени занимает выполнение определенного действия с файлом?

10

Я хотел знать, есть ли уравнение, которое Windows использует для определения того, сколько времени требуется для выполнения действия с файлом, скажем, удаления, копирования, удаления или установки.

введите описание изображения здесь

Например, когда я удаляю файл, и Windows говорит: «Оставшееся время: 18 секунд», как рассчитывается это число и как используется?

yuritsuki
источник
1
Поскольку это число часто неверно, оно основано на # файлах для удаления, размере и скорости удаления, рассчитанных на увеличение или уменьшение предположения.
Кибернард
1
@ Ramhound И как он узнает, как быстро это займет? Это та же статическая переменная для всех остальных машин, в том числе работающих на SSD, HD? Что делать, если у меня есть 200 ГБ оперативной памяти? Что если у меня 10 МБ ОЗУ? Как рассчитывается, насколько «быстрое» действие?
Юрицуки
2
@imreallyfamecore Основная идея в том, что он измеряет, насколько быстро он идет в течение нескольких секунд, и предполагает, что остальная часть процесса будет продолжаться в среднем с той же скоростью. Если средняя скорость изменяется со временем, она корректирует оценку (что приводит к печально известному «Windows сказала, что она будет скопирована через 10 минут, а прошло уже 2 часа!»). Впрочем, это всего лишь предположение - у ОС или любого приложения нет способа узнать, сколько времени это действительно займет. Что делать, если жесткий диск поврежден? Или вы переводите по сети? Или есть много фрагментации?
Луаан
6
Я знаю, что меня за это накажут, но я не могу с собой поделать. Это НЕ твой ответ. XKCD: Оценка
KlaymenDK
10
Код:timeLeft = random(1,100);
MadTux

Ответы:

20

Вы заметили, что обычно это не дает никаких оценок в первые секунды?

Это потому, что в первые секунды он просто выполняет ту операцию, которую должен выполнить. Затем, через некоторое время, он знает, сколько он уже скопировал / удалил / и т.д. , и сколько времени это заняло . Это дает вам среднюю скорость операции.

Затем разделите оставшиеся байты на скорость, и у вас будет время, необходимое для завершения операции.

Это начальная школа по математике. Если вы хотите проехать 360 км, и в конце первой минуты вы проехали 1 км, сколько вам потребуется, чтобы добраться до пункта назначения?

Ну, скорость составляет 1 км / мин. Это 60 км / ч. 360 км, разделенные на 60 км / ч, дают вам 6 часов (или 360 км / 1 км / мин = 360 минут = 6 часов). Поскольку вы уже путешествовали в течение одной минуты, то оставшееся время составляет примерно 5 часов 59 минут.

Замените «travel» на «copy», а «km» на «bytes», и это ваш вопрос.

Разные системы имеют разные способы оценки времени. Вы можете взять последнюю минуту, и оценки могут сильно отличаться, или вы можете взять полный рабочий день, и если скорость действительно изменяется постоянно, ваши оценки могут быть далеки от реальности. То, что я описал, является самым простым методом.

Valmiky Arquissandas
источник
12
Просто чтобы уточнить: вы утверждаете, что именно так Windows это делает? Или вы просто иллюстрируете простую арифметику, с помощью которой можно получить ответ?
Шреддеррой
10
и, наконец, 1%это требуется time so far * rand[0 - 10]при отображенииfew seconds left
Марк
1
Если вам интересно, этот вопрос расскажет вам, как Windows (и OSX) форматирует время, оставшееся в индикаторе выполнения, как только у него появляется представление о том, как долго остается ux.stackexchange.com/q/23624
Ричард,
1
Я не говорю, что так делает Windows. Если он делает это именно так, это совпадение. Похоже, что это так, но это способ, с помощью которого можно получить ответ. Мне показалось, что плакат хотел знать, как это делается, и в качестве примера была приведена Windows. Постоянная «один размер подходит всем», умноженная на оставшийся размер (как он предложил), совершенно недостижима, и я думаю, что это показало, что он понятия не имел, как были сделаны эти оценки.
Valmiky Arquissandas
4
@ValmikyArquissandas: Раймонд Чен (разработчик в команде Windows в Microsoft) подтверждает этот алгоритм в публикации в своем блоге, а также объясняет, почему он может быть неправильным. blogs.msdn.com/b/oldnewthing/archive/2004/01/06/47937.aspx
Ричард
1

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

Проблема с индикатором выполнения операций с файлами заключается в том, что он корректен только для единообразных данных, поэтому, если вы скопируете 100 файлов одинакового размера, а ваш диск больше ничего не делает, ожидаемый прогресс будет заметен, но что если первый 99 файлов были маленькими txt-файлами, а последний - большим видеофайлом? Прогресс будет выходной.

Эта проблема усугубляется, когда вы работаете не с файлами в одной папке, а с несколькими подпапками. Допустим, у вас есть 5 вложенных папок, и вы хотите удалить их (тогда размер не имеет большого значения), первые 4 папки содержат менее 10 файлов, поэтому к моменту, когда операция подходит к 5-й папке, она думает, что На 80% сделано, и папка Boom 5 содержит 5000 файлов, и ваш прогресс возвращается к 1%

WinXP попытался обойти это путем предварительного подсчета количества файлов, что означало, что, когда папка не была проиндексирована в Windows, в зависимости от количества файлов, XP действительно не запускала операцию в течение первых 20 секунд (времени, которое требовалось для считать), который всех разозлил.

Поэтому, хотя у меня также нет специальных знаний о том, как это делает Windows (но что еще там есть, кроме подсчета файлов и байтов), я надеюсь, что смогу проиллюстрировать, почему она несовершенна и почему она никогда не будет идеальной.

Лучшее, что вы могли бы сделать, - это не полагаться исключительно на количество файлов ИЛИ bytecount, а построить среднее из двух.

Или, если вы хотите сойти с ума, ОС может запустить базу данных о том, сколько времени эти операции выполнялись на вашей машине в прошлом, и учесть это в уравнении.

Заключительная мысль: если бы кто-то подумал о файловой системе, которая позволяла бы ОС знать, какой размер имеет каждая папка, без предварительного ее расчета, вы, по крайней мере, получили бы правильную оценку прогресса при удалении целых папок, а не только их частей.

Troik
источник