使用符号链接到网络位置时,软件运行速度更快

时间:2015-06-03 10:31:19

标签: windows networking symlink mapped-drive

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

为了有一些上下文,我们的软件是一个C ++程序,它使用Adobe库来翻录pdf页面。我们已经知道谁是错误的(这是来自Adobe的Cooltype dll),但我们更想知道如何才能产生这样的差异。

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

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

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

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

当然,我们在公司的其他计算机上进行了相同的测试。根据网络连接,数字会发生变化(网络连接更好:UNC为1'03“,映射驱动器为45”,符号链接为28“),但每次使用符号链接时效果更佳。

如果有人对可能造成这种差异的因素有任何想法,我会全力以赴。

编辑:使用Process Monitor,我可以看到执行方面的差异。当尝试加载其中一个小文件时,它会在驱动器的根目录上执行某些操作。 使用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 

0 个答案:

没有答案