这是一个奇怪的...
在Windows窗体应用程序(VB.NET/VS 2005)中,我需要偶尔检查是否插入了应用程序DVD。
在我的生产机器(以及我们的大多数客户端)中,此代码执行时间不到一秒。但在某些机器中,大约需要8到10秒。我找不到那些速度较慢的PC(不同的操作系统,不同的RAM,不同的处理器,更多的驱动器,更少的驱动器等)的共同点。
它发生在大约4%的测试机器上(以及我们的一些朋友机器,到现在为止:))
由于这个功能只被召唤一次,我可以忍受它。但奇怪的是,我们偶然发现,如果VMWare虚拟机正在运行,那么代码(在主机操作系统中运行)将花费不到一秒的时间!
有没有人遇到过类似的东西?至少有人能为此提供一些解释吗?
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
答案 0 :(得分:1)
此代码的成本在哪里?分析对坏机器
有帮助我认为成本是在DriveInfo调用的某个地方 - 在DriveInfo背后的代码中查找反射器:
.cctor似乎非常无害 - 只是验证字母约束。
.GetDriveType直接调用等效的Win32 API。怀疑这会尝试访问目录root,因为其中一个潜在的返回结果是DRIVE_NO_ROOT_DIR。
.IsReady - 似乎试图“打开”驱动器根目录填充FILE_ATTRIBUTE结构。再次看起来类似于GetDriveType - 可能很昂贵。
后者的API都有可能尝试触摸驱动器文件系统。从那里开始,你依赖于设备的行为,它是音量的驱动因素,关于“未安装”,“准备就绪”,“未准备好”等等意味着。例如试图旋转磁盘。
由于延迟大约是几秒钟,我同样怀疑慢速软盘/ DVD / CD卷的枚举与其他媒体类型相比花费的时间最多。 Floppies特别习惯有很长的超时时间。
答案 1 :(得分:0)
您是否考虑过网络映射驱动器?他们对某些事情的反应非常缓慢。
您是否尝试过获取驱动器列表,然后并行检查每个驱动器而不是串行检查?找到结果时取消所有待处理的请求并返回true。由于真正的DVD驱动器可能会立即返回,这可以防止任何缓慢的卷拖动其余的进程。