Як Windows визначає, скільки часу потрібно виконати певну дію над файлом?


10

Мені хотілося знати, чи існує рівняння, яке Windows використовує, щоб визначити, скільки часу потрібно на виконання дії над файлом, скажімо видалити, скопіювати, стерти чи встановити.

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

Наприклад, коли я видаляю файл, а Windows каже "Залишився час: 18 секунд", як це обчислити це число і за допомогою чого?


1
Оскільки це число часто неправильне, то, на основі # файлів, здогадується, щоб видалення, розмір та швидкість видалення були приурочені до збільшення або зменшення здогадки.
cybernard

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 хвилин.

Замініть "проїзд" на "копію" і "км" на "байти", і ось це ваше питання.

У різних системах є різні способи оцінки часу. Ви можете взяти останню хвилину, і оцінки можуть сильно різнитися, або ви можете взяти повний час, і якщо швидкість насправді постійно змінюється, ваші оцінки можуть бути далеко не реальністю. Те, що я описав, - це найпростіший метод.


12
Просто для уточнення: Ви стверджуєте, що так це робить Windows? Або ви просто ілюструєте якусь просту арифметику, за допомогою якої можна отримати відповідь?
Шреддеррой

10
і останнє, 1%що потрібно time so far * rand[0 - 10]під час показуfew seconds left
Марк

1
Якщо вас цікавить, це запитання розповідає про те, як Windows (і OSX) формує
Річард

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% виконано, а папка 5-го буму містить 5000 файлів, а ваш прогрес скачується до 1%

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

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

Найкраще, що ви могли б зробити, - це не покладатися лише на кількість файлів АБО, але будувати середнє значення з двох.

Або якщо ви хотіли звести з розуму додаткові дії, ОС може запустити базу даних про те, як тривали ці операції в минулому на вашій машині, і врахуйте, що це в рівняння.

Заключна думка: Якщо хтось подумає про файлову систему, яка дозволила б ОС знати, який розмір має кожна папка, не обчислюючи її спочатку, ви принаймні отримаєте правильну оцінку ходу при видаленні цілих папок, а не лише їх частин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.