繁体   English   中英

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

[英]Curl Powershell windows 10 slower than command prompt why?

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

curl.exe yourfileonS3 >> output.bin

为了补充briantist 的有用答案

  • 在 PowerShell 中, 重定向运算符>>>实际上是Out-FileOut-File -Append

  • >>>因此不仅仅是字节流管道,事实上,从 v7.2 开始,PowerShell支持将原始字节 output发送到文件。

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

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

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

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

有关详细信息,请参阅此答案


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

有关此的完整上下文,请参阅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版本,上面同样的命令还是有很大区别的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM