1

在测试我们的软件的性能问题时(当软件在网络驱动器上时,我们有很大的不同),我们发现了一些非常奇怪的东西。

只是为了了解一些上下文,我们的软件是一个 C++ 程序,它使用 Adob​​e 库来翻录 pdf 页面。我们已经知道谁是错误的(它是 Adob​​e 的 Cooltype dll),但我们更想知道怎么可能有这样的差异。

所以,基本上我们从不同的硬件位置启动了我们的软件测试。每次我们通过 Windows 资源管理器访问该位置并从那里运行它。

  • 如果软件在本地驱动器( D:\TestLocal\ ) 上,则需要19 秒
  • 如果软件位于网络位置并且我们使用UNC 路径( \\Fileserver_A\Development\TestNetwork\ ) 访问它,则需要2 分 44 秒。到目前为止,还可以(即使时间上有很大的差距)。
  • 如果我将网络驱动器 ( J:\ ) 映射到网络位置\\Fileserver_A\\Development\,并使用映射的网络驱动器( J:\TestNetwork\ ) 通过 Windows 资源管理器访问我的文件夹,只需1 分钟 43秒
  • 如果我在D:\上创建到网络驱动器(mklink /DD:\TestLink\ \\Fileserver_A\Development\TestNetwork\ )的符号链接并通过D:\TestLink\访问软件位置,则需要29 秒

我根本不知道这个 dll 做了什么,因为它是第 3 方 dll,我只知道它加载了许多与可执行文件位于同一位置的小文件 (180)。这将解释本地/网络之间的巨大差异。

但这并不能解释为什么通过映射驱动器访问完全相同的位置会稍微提高速度(从 2'44" 到 1'43")并使用在本地驱动器上创建的符号链接访问它会进一步提高速度(2'44" 到 29")。每次,它都是在完全相同的网络位置上启动的完全相同的软件。

当然,我们在公司的其他电脑上也做了同样的测试。根据网络连接,数字会发生变化(网络连接更好:UNC 为 1'03",映射驱动器为 45",符号链接为 28"),但每次使用符号链接时我们都会获得更好的结果。

如果有人对可能导致这种差异的原因有丝毫的想法,我会全神贯注。

编辑:使用进程监视器,我可以看到执行的不同。当尝试加载其中一个小文件时,它会在驱动器的根目录上执行某些操作。使用 D: 上的符号链接,它只在每个文件之前完成一次:

CreateFile  D:\ SUCCESS Desired Access: Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Attributes: n/a, ShareMode: None, AllocationSize: n/a, OpenResult: Opened
QueryNameInformationFile    D:\ SUCCESS Name: \
QueryAttributeInformationVolume D:\ SUCCESS FileSystemAttributes: Case Preserved, Case Sensitive, Unicode, ACLs, Compression, Named Streams, EFS, Object IDs, Reparse Points, Sparse Files, Quotas, Transactions, 0x3c00000, MaximumComponentNameLength: 255, FileSystemName: NTFS
CloseFile   D:\ SUCCESS 

但是当它是一个网络驱动器时,它会在每个文件之前重复它 35 次!!!

CreateFile  \\Fileserver_A\Development\ IS DIRECTORY    Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Write, AllocationSize: n/a
CreateFile  \\Fileserver_A\Development\ SUCCESS Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Open Reparse Point, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
FileSystemControl   \\Fileserver_A\Development\ NOT REPARSE POINT   Control: FSCTL_GET_REPARSE_POINT
CloseFile   \\Fileserver_A\Development\ SUCCESS 
CreateFile  \\Fileserver_A\Development\ SUCCESS Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
QueryDeviceInformationVolume    \\Fileserver_A\Development\ SUCCESS DeviceType: Disk, Characteristics: Remote
CloseFile   \\Fileserver_A\Development\ SUCCESS 
4

0 回答 0