【问题标题】:Curl Powershell windows 10 slower than command prompt why?Curl Powershell windows 10 为什么比命令提示符慢?
【发布时间】:2021-08-15 20:41:12
【问题描述】:

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

curl.exe yourfileonS3 >> output.bin

【问题讨论】:

    标签: windows powershell curl download


    【解决方案1】:

    补充briantist's helpful answer

    • 在 PowerShell 中,redirection operators >>> 实际上是 Out-FileOut-File -Append 的别名。

    • >>> 因此只是字节流管道,事实上,PowerShell v7.2 不支持原始字节输出发送到文件。

      • 相反,PowerShell总是将任何外部程序的输出解码为 text[string] 实例),基于报告的字符编码[Console]::OutputEncoding] 然后,在使用 Out-File(可能通过 > / >>)保存到目标文件时,重新编码这些字符串,使用该 cmdlet 的默认字符编码(除非被覆盖在显式的Out-File 调用中使用-Encoding)。

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

    要获得原始字节处理,请调用 cmd.exe[1] 并使用 重定向运算符

    cmd /c 'curl.exe yourfileonS3 >> output.bin'
    

    更多信息请参见this answer


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

    【讨论】:

    • 太棒了!这是我没有时间完成的缺失部分。而且我怀疑在尝试将二进制数据下载到文件中时,无法处理原始字节是一件大事。像往常一样出色的答案。
    【解决方案2】:

    请参阅mklement0's answer 了解有关此内容的完整上下文(我建议接受那个!),重要的一点是,在 PowerShell 中处理重定向中的字节流有问题且容易出错,应该避免.


    所以我调查了这个,我相信原因是>>(文件重定向)是慢的部分。

    我最初怀疑您可能正在调用 curl(在 Windows PowerShell 中别名为 Invoke-WebRequest),但我能够直接在 PowerShell 中重现 curl.execmd.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
    

    这足以显示出明显的差异。

    我还确认,与后来的跨平台版本 (pwsh.exe) 相比,此问题在 Windows PowerShell 中稍微严重一些。在 Windows 7.1.0 版本中,上面相同的命令仍然显示出很大的差异。

    【讨论】:

    • 是的,我注意到 curl 也只是调用了 invoke-webrequest。我会尝试不使用>>
    猜你喜欢
    • 2016-02-26
    • 2022-01-25
    • 2018-06-30
    • 2019-10-15
    • 2020-02-25
    • 2021-01-25
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多