[英]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 的有用答案:
>
和>>
因此不仅仅是字节流管道,事实上,从 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.