Почему олицетворенная параллельная функция работает медленно при первом запуске, а затем ускоряется? - PullRequest
0 голосов
/ 27 февраля 2019

Итак, у меня есть код, который копирует файлы на 5 удаленных компьютеров в сети.У меня есть класс, который олицетворяет методы, которые требуется для входа

''' <summary>
''' Returns the names of the files including their path that match the regex pattern found in this directory. 
''' </summary>
''' <param name="searchOption">
''' The parameter option SearchOption.AllDirectories indicates that the search should include the current directory and any subdirectories
''' The parameter option SearchOption.TopDirectoryOnly indicates that the search should only include the current directory. 
''' </param> 
Public Function GetFileContent(filePath As String, searchPattern As String, Optional searchOption As SearchOption = Nothing) As String() Implements IEPMADirectoryAccess.GetFileContent
    If searchOption = Nothing Then
        searchOption = SearchOption.TopDirectoryOnly
    End If

    LogonUser(UserName, Domain, Password, LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 0, UserToken)
    Using WindowsIdentity.Impersonate(UserToken)
        Return Directory.GetFiles(filePath, searchPattern, searchOption)
    End Using
End Function
''' <summary>
''' Get the name of the Ward from the directory of the current file path 
''' </summary>
Public Function GetWardName(filePath As String) As String Implements IEPMADirectoryAccess.GetWardName
    LogonUser(UserName, Domain, Password, LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 0, UserToken)
    Using WindowsIdentity.Impersonate(UserToken)
        Return New DirectoryInfo(Path.GetDirectoryName(filePath)).Name
    End Using
End Function
''' <summary>
''' Creates a directory for the given path 
''' </summary>
Public Sub CreateDirectory(directoryPath As String) Implements IEPMADirectoryAccess.CreateDirectory
    LogonUser(UserName, Domain, Password, LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 0, UserToken)
    Using WindowsIdentity.Impersonate(UserToken)
        Directory.CreateDirectory(directoryPath)
    End Using
End Sub
''' <summary>
''' Deletes a file from the specified path
''' </summary>
Public Sub DeleteFile(filePath As String) Implements IEPMADirectoryAccess.DeleteFile
    LogonUser(UserName, Domain, Password, LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 0, UserToken)
    Using WindowsIdentity.Impersonate(UserToken)
        File.Delete(filePath)
    End Using
End Sub
''' <summary>
''' Copies a file from the source path to the destination path 
''' </summary>
Public Sub CopyFile(sourceFilePath As String, destFilePath As String, overwrite As Boolean) Implements IEPMADirectoryAccess.CopyFile
    LogonUser(UserName, Domain, Password, LogonType.LOGON32_LOGON_NEW_CREDENTIALS, 0, UserToken)
    Using WindowsIdentity.Impersonate(UserToken)
        File.Copy(sourceFilePath, destFilePath, overwrite)
    End Using
End Sub

часть кода в параллельном цикле выглядит следующим образом:

                                                        'If PC is switched on 
                                                         If IsOnline(device.PCName) Then

                                                             'For each PC of the ward, get the corresponding folder path
                                                             targetPath = "\\" + device.PCName + "\c$Report P\"

                                                             'Requires access to the network share 
                                                             If Not Directory.Exists(targetPath) Then
                                                                 DirectoryAccess.CreateDirectory(targetPath)
                                                             End If

                                                             'Requires access to the network share 
                                                             For Each fileName As String In DirectoryAccess.GetFileContent(targetPath, "*.pdf")
                                                                 'Purge (Delete) previous versions of this file in the destination folder  
                                                                 Dim fileConst As String

                                                                 fileConst = arr(1)
                                                                 If fileName.Contains(fileConst) Then
                                                                     'Requires access to the network share 
                                                                     DirectoryAccess.DeleteFile(fileName)
                                                                 End If
                                                             Next

                                                             DirectoryAccess.CopyFile(f, Path.Combine(targetPath, Path.GetFileName(f), True)


                                                         End If

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

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

Первоначально параллельное копирование занимает 18 секунд, но затем становится 2,82 секунды для второго запуска.

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

Третий прогон составляет 1,81 секунды.

Я проверил, что блоки использования для олицетворения правильно расположились и вернулись к моим исходным учетным данным после выхода из блока использования.Я не уверен, почему это медленно в первом запуске, но затем ускоряется?Может быть, изначально четыре компьютера неактивны, поэтому процесс копирования активирует их, но занимает больше времени?

У меня есть функция IsOnline, которая проверяет, включены ли компьютеры, если нет, я просто пропускаю их, чтобы убедиться, что это не замедляет процесс.

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

1 Ответ

0 голосов
/ 22 марта 2019

Оказалось, что это было медленно, потому что время измерялось по разному количеству штук в любой момент времени.Некоторые ПК во время измерения переходили в спящий режим, что влияло на время обработки

...