1

これは奇妙なものです... Windowsフォームアプリ(VB.NET/VS 2005)では、アプリケーションDVDが挿入されているかどうかを時々確認する必要があります。
私の運用マシン (および大部分のクライアント) では、このコードの実行に 1 秒もかかりません。ただし、一部のマシンでは、約 8 ~ 10 秒かかります。速度が遅いいくつかの PC で共通点を見つけることができませんでした (OS が異なる、RAM が異なる、プロセッサが異なる、ドライブが多い、ドライブが少ないなど)。
テストマシンの約4%で発生します(そして、今では友人のマシンのいくつか:))
この関数は 1 回しか呼び出されないため、問題なく使用できます。しかし、奇妙なことに、まったくの幸運でこれに遭遇しました.VMWare仮想マシンが実行されている場合、コード(ホストOSで実行されている)は予想される1秒未満で完了します!!!
誰もこれに似たものに遭遇したことがありますか? 誰かが少なくともこれについて何らかの説明を提供できますか?

i_DrivesArray = GetLogicalDrives()
    i_DrivesCount = i_DrivesArray.Length


    For i_DriveNumber = 0 To i_DrivesCount - 1
        i_DriveInformation = New DriveInfo(i_DrivesArray(i_DriveNumber))

        If (i_DriveInformation.DriveType = i_DriveTargetType And i_DriveInformation.IsReady = True) Then

            If File.Exists(i_DriveInformation.Name.ToString & ci_CDIdentifiers(i_Counter).ToString) = True Then
                ci_IsCDInserted = True
                ci_PathCD = i_DriveInformation.Name.ToString
                Exit For
            End If

        End If
    Next
4

2 に答える 2

1

このコードのどこにコストがありますか? プロファイリングは、悪いマシンで本当に役立ちます

コストは、これらの DriveInfo 呼び出しのどこかにあると思います。DriveInfo の背後にあるコードをリフレクターで調べます。

.cctor はかなり無害に思えます - 文字の制約を検証するだけです。

.GetDriveType は、同等の Win32 API を直接呼び出します。返される可能性のある結果の 1 つが DRIVE_NO_ROOT_DIR であるため、ディレクトリ ルートへのアクセスが試行されると思われます。

http://msdn.microsoft.com/en-us/library/aa364939.aspx

.IsReady - ドライブのルート ディレクトリを「開こう」としているように見え、FILE_ATTRIBUTE 構造にデータが入力されます。これも GetDriveType に似ていますが、おそらく高価です。

後者の API はどちらも、ドライブのファイルシステムにアクセスしようとする可能性があります。そこから先は、デバイスの動作に依存し、「マウントされていない」、「準備ができている」、「準備ができていない」などのボリュームのドライバーです。たとえば、ディスクをスピンアップしようとしています。

遅延は数秒程度であるため、低速のフロッピー/DVD/CD ボリュームの列挙は、他のメディア タイプと比較して最も時間がかかると同様に考えています。特にフロッピーは非常に長いタイムアウトを持っていました。

于 2009-01-14T01:58:21.237 に答える
0
  • ネットワークにマップされたドライブを検討しましたか? 特定の事柄については、反応が非常に遅くなることがあります。

  • ドライブのリストを取得して、各ドライブを順次ではなく並行してチェックしてみましたか? 結果が見つかったときに保留中のリクエストをキャンセルし、true を返します。実際の DVD ドライブはおそらくすぐに戻るので、これにより、遅いボリュームが残りのプロセスを引きずるのを防ぐことができます。

于 2008-11-04T16:49:32.057 に答える