使用类似于curl的Invoke-WebRequest测量响应时间

时间:2018-07-05 19:23:18

标签: powershell curl response-time

我有一个curl命令,通过调用服务中的每个动作来中断响应时间。

curl -w "@sample.txt" -o /dev/null someservice-call

我想使用PowerShell的内置Invoke-WebRequest调用以类似的方式测量响应时间。到目前为止,我可以使用Measure-Command获得总响应时间。有人可以帮我吗?

sample.txt中使用的curl的内容:

time_namelookup:  %{time_namelookup}\n               
time_connect:  %{time_connect}\n            
time_appconnect:  %{time_appconnect}\n           
time_pretransfer:  %{time_pretransfer}\n              
time_redirect:  %{time_redirect}\n         
time_starttransfer:  %{time_starttransfer}\n                            
----------\n          
time_total:  %{time_total}\n

3 个答案:

答案 0 :(得分:1)

以毫秒为单位的时间:

$url = "google.com"
(Measure-Command -Expression { $site = Invoke-WebRequest -Uri $url -UseBasicParsing }).Milliseconds

答案 1 :(得分:0)

这样做似乎没有任何明显的开销:

$StartTime = $(get-date)
Invoke-WebRequest -Uri "google.com" -UseBasicParsing
Write-Output ("{0}" -f ($(get-date)-$StartTime))

答案 2 :(得分:0)

其他解决方案指出,仅使用Poershell时会有性能问题。

最有效的解决方案可能是使用内置的度量编写一些c#。但是,如果事先对其进行了不正确的编译,则需要编译c#时加载时间将大大增加。

但是还有另一种方式。

由于您可以在Powershell中使用几乎所有的dotnet构造,因此您可以在Powershell本身中编写相同的请求和测量逻辑。 我写了一个小方法可以解决问题:

function Measure-PostRequest {
    param(
        [string] $Url,
        [byte[]] $Bytes,
        [switch] $Block
    )

    $content = [Net.Http.ByteArrayContent]::new($bytes);
    $client = [Net.Http.HttpClient]::new();
    $stopwatch = [Diagnostics.Stopwatch]::new()
    $result = $null;

    if ($block) {
        # will block and thus not allow ctrl+c to kill the process
        $stopwatch.Start()
        $result = $client.PostAsync($url, $content).GetAwaiter().GetResult()
        $stopwatch.Stop()
    } else {
        $stopwatch.Start()
        $task = $client.PostAsync($url, $content)
        while (-not $task.AsyncWaitHandle.WaitOne(200)) { }
        $result = $task.GetAwaiter().GetResult()
        $stopwatch.Stop()
    }

    [PSCustomObject]@{
        Response = $result
        Milliseconds = $stopwatch.ElapsedMilliseconds
    }
}