我有一个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
答案 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
}
}