Curl Powershell windows 10 比命令提示符慢,为什么?

问题描述 投票:0回答:2

只需一个漂亮的curl 命令即可使用所有默认值调用S3 端点进行下载。在 Mac 上,或者在使用命令行的 PC 上,如果缓存在 CDN 上,我会得到 103MBsec,否则会得到 80MBsec。相同的命令,相同的存储桶,相同的对象,使用“curl.exe”,通过 powershell 调用时我得到 1MBSec。我猜 powershell 做了一些不同的事情导致它变得非常慢?我尝试使用最新的 curl 二进制文件,但仍然相同。 我想当我使用curl命令时我误解了powershell在做什么

curl.exe yourfileonS3 >> output.bin
windows powershell curl download
2个回答
4
投票

更新

  • PowerShell(核心) v7.4+现在支持外部程序的原始字节处理 - 请参阅这个答案

  • 因此,以下内容仅适用于 Windows PowerShellPowerShell (Core) v7.3-


补充

briantist的有用答案

  • 在 PowerShell 中,

    重定向运算符 >

    >>
     实际上是 
    Out-File
    Out-File -Append
     的别名。

    因此,
  • >

    >>
     
    not 仅仅是字节流管道,事实上,Windows PowerShell 和 PowerShell(核心)直至 v7.3 not 支持发送 raw字节输出到文件。

    • 相反,

      PowerShell invariously 根据 [string] 报告的字符编码将任何外部程序的输出解码为 text

      [Console]::OutputEncoding]
       实例),然后使用 
      Out-File
       保存到目标文件(可能通过 
      >
       / 
      >>
      ),使用该 cmdlet 的默认字符编码
      重新编码这些字符串(除非在显式 -Encoding
       调用中用 
      Out-File
       覆盖)。

    • 这不仅不能保留外部程序的原始字节 输出,它增加了大量的开销。

要进行原始字节处理,请调用 cmd.exe

[1] 并使用 its 重定向运算符:

cmd /c 'curl.exe yourfileonS3 >> output.bin'
请参阅

此答案了解更多信息。


[1] 在类 Unix 平台上,使用 sh -c 'curl yourfileonS3 >> output.bin'


    


3
投票
请参阅

mklement0 的回答,了解有关此内容的完整上下文(我建议接受该答案!),重要的是,在 PowerShell 中处理重定向中的字节流是有问题且容易出错,应避免。


所以我研究了这个,我相信原因是

>>

(文件重定向)是缓慢的部分。

我最初怀疑您可能会调用

curl

(在 Windows PowerShell 中是 
Invoke-WebRequest
 的别名),但我能够直接在 PowerShell 中重现 
curl.exe
cmd.exe
 之间的速度差异,并测量它,这方式:

# call curl.exe and do redirection in PowerShell Measure-Command -Expression { curl.exe https://uploader.codecov.io/v0.1.0_6943/linux/codecov >> delme.bin } del delme.bin # call cmd.exe and do redirection there Measure-Command -Expression { & cmd.exe /c 'curl.exe https://uploader.codecov.io/v0.1.0_6943/linux/codecov >> delme.bin' } del delme.bin
这足以显示出明显的差异。

我还确认,与后来的跨平台版本相比,这个问题在 Windows PowerShell 中更严重一些 (

pwsh.exe

)。在 Windows 7.1.0 版本中,上面相同的命令仍然显示出很大的差异。

© www.soinside.com 2019 - 2024. All rights reserved.