Должен ли я использовать async для функции, которая запускается много раз? - PullRequest
0 голосов
/ 17 октября 2018

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

public string CopyFile(string sourceFile, string fileName, bool forceCopy)
    {
        fileName = GetSafePathname(GetSafeFilename(fileName));
        string DestinationFile = Path.Combine(DestinationFolder, fileName);

        if (File.Exists(DestinationFile) && !forceCopy)
        {
           return DestinationFile = null;
        }

        else if (!File.Exists(DestinationFile)) //copy the file if it does not exist at the destination
        {
            File.Copy(sourceFile, DestinationFile);
            return DestinationFile;
        }

        else if (forceCopy) //if forceCopy, then delete the destination file and copy the new one in its place
        {
            File.Delete(DestinationFile);
            File.Copy(sourceFile, DestinationFile);
            return DestinationFile;
        }

        else { throw new GenericException(); }
    }

1 Ответ

0 голосов
/ 17 октября 2018

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

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

В некоторой степени многозадачность может даже принести пользу с минимальной пропускной способностью: в то время как одна задача в настоящее время облагает ЦП налогом до или послеработа, другой может писать.

Но управление многими операциями также требует ресурсов.И рано или поздно груз необходимости управлять всеми этими операциями будет поглощать все выгоды.Paralell Slowdown устанавливает: https://en.wikipedia.org/wiki/Parallel_slowdown

Только несколько операций являются приятными / захватывающими параллелями.Для них многопоточность замедляется очень поздно или даже никогда: https://en.wikipedia.org/wiki/Embarrassingly_parallel Ваш случай, без сомнения, не один из них.В самом деле, вы можете предположить, что Paralell Slowdown устанавливается очень быстро.

Редактировать:

Чтобы привести пример математики, давайте предположим, что каждая операция с файлом тратит 10 мс ЦП,200 мс для чтения / записи.

Если вы запускаете его последовательно в одном потоке без многозадачности более 200 файлов, это будет (200 + 10) * 200 мс или 42 секунды (клянусь, я этого не планировал).

Если с асинхронным режимом возможно, что одна или несколько операций выполняют свою работу ЦП 10 мс во время перезаписи другой операции.Так что для всех, кроме последнего и первого файла, его можно игнорировать.Так вдруг это: (200 * 200) +10 мс или 40,01 секунды.Сохранено почти 2 секунды.

Теперь запуск многих в основном увеличивает среднее время ЦП для каждого из них.Главным образом накладные расходы на выяснение того, какая операция должна получить процессорное время прямо сейчас.К тому моменту, когда издержки достигают в среднем около 1900 мс, вы возвращаетесь к 42 секундам.И если вы добавите больше после этого, накладные расходы на самом деле приведут к тому, что на работу ЦП будет затрачено больше времени, чем на всю запись.

...