Ok. I have some evidence and a potential work around for y’all.
The problem is that having large Endpoint script blocks, with lots of variables, is causing a big slow down.
Took @Claustn example and created a dashboard that had 1000 rows and 4 buttons per row.
I added the large endpoint script block into each button’s onClick handler. The end result was a grid that took 17.77 seconds to load.
I ran the performance profiler on it and the slowness is UD trying to resolve all the variables so that it can store them later.
So, this led me to a modified example. Instead of having a large script block, I instead put all that code into a function to be called and to pass in any arguments I’m looking for. This resulted in a grid that took 2.45 seconds to load.
Pretty big improvement! I’ve included the examples below for the good\bad performance.
Can you guys try making a similar change to your dashboards? I also think this will make it easier to read the dashboard scripts.
Bad Performance Example:
Import-Module UniversalDashboard
function Invoke-ButtonClick {
param(
$ArgumentList
)
$Cache:KatanaStatus = Get-KatanaAgentInfo -agentName $argumentlist.hostname -KatanaServer $argumentlist.katana_server
#Wait-Debugger
Show-UDModal -Header {
New-UDHeading -Size 4 -Text " Status $($ArgumentList.hostname)"
} -Content {
$red = "green"
if ($Cache:KatanaStatus.building) {
$BackGround = "red"
$AgentStatus = 'Agent is building'
}
else {
$BackGround = "green"
$AgentStatus = 'Agent is available'
}
New-UDCard -BackgroundColor "$BackGround" -Title "$AgentStatus" -Content {
New-UDTable -Title "Additional information" -Style striped -Headers @(" ", " ") -Endpoint {
Try {
$Table = [ordered]@{
'Yumi URL' = New-UDLink -Text "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -Url "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -OpenInNewWindow
'Katana URL' = New-UDLink -Text $($Cache:KatanaStatus.KatanaURL) -Url $($Cache:KatanaStatus.KatanaURL) -OpenInNewWindow
'Build URL' = New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
'Builder Name' = $Cache:KatanaStatus.BuilderName
'Build Start Time' = $Cache:KatanaStatus.BuildStartTime | Out-String
'Build ETA' = $Cache:KatanaStatus.BuildETA
'Reason' = $Cache:KatanaStatus.Reason
}
$Table.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
}
Catch {
$Lookup = ' '
$Lookup | Out-UDTableData -Property @("Name", "Value")
}
} -ArgumentList $argumentlist
# New-UDCard -BackgroundColor white -Title 'Yumi URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.YumiURL) -Url $($Cache:KatanaStatus.YumiURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Build URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Builder Name' -Content { $Cache:KatanaStatus.BuilderName
# }
# New-UDCard -BackgroundColor white -Title 'Build Start Time' -Content { $Cache:KatanaStatus.BuildStartTime | Out-String
# }
# New-UDCard -BackgroundColor white -Title 'Build ETA' -Content { $Cache:KatanaStatus.BuildETA
# }
# New-UDCard -BackgroundColor white -Title Reason -Content { $Cache:KatanaStatus.Reason
# }
}
}
}
$Page = New-UDPage -Name 'YumiPage' -Icon link -Content {
# Wait-Debugger
New-UDGrid -Title 'Yumi' -Headers @('Status', 'Status1', 'Status2', 'Status3') -Properties @('Status', 'Status1', 'Status2', 'Status3') -Endpoint {
$YumiGrid = 1..1000 | ForEach-Object -Process {
[PSCustomObject]@{
Status3 = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint {
$Cache:KatanaStatus = Get-KatanaAgentInfo -agentName $argumentlist.hostname -KatanaServer $argumentlist.katana_server
#Wait-Debugger
Show-UDModal -Header {
New-UDHeading -Size 4 -Text " Status $($ArgumentList.hostname)"
} -Content {
$red = "green"
if ($Cache:KatanaStatus.building) {
$BackGround = "red"
$AgentStatus = 'Agent is building'
}
else {
$BackGround = "green"
$AgentStatus = 'Agent is available'
}
New-UDCard -BackgroundColor "$BackGround" -Title "$AgentStatus" -Content {
New-UDTable -Title "Additional information" -Style striped -Headers @(" ", " ") -Endpoint {
Try {
$Table = [ordered]@{
'Yumi URL' = New-UDLink -Text "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -Url "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -OpenInNewWindow
'Katana URL' = New-UDLink -Text $($Cache:KatanaStatus.KatanaURL) -Url $($Cache:KatanaStatus.KatanaURL) -OpenInNewWindow
'Build URL' = New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
'Builder Name' = $Cache:KatanaStatus.BuilderName
'Build Start Time' = $Cache:KatanaStatus.BuildStartTime | Out-String
'Build ETA' = $Cache:KatanaStatus.BuildETA
'Reason' = $Cache:KatanaStatus.Reason
}
$Table.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
}
Catch {
$Lookup = ' '
$Lookup | Out-UDTableData -Property @("Name", "Value")
}
} -ArgumentList $argumentlist
# New-UDCard -BackgroundColor white -Title 'Yumi URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.YumiURL) -Url $($Cache:KatanaStatus.YumiURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Build URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Builder Name' -Content { $Cache:KatanaStatus.BuilderName
# }
# New-UDCard -BackgroundColor white -Title 'Build Start Time' -Content { $Cache:KatanaStatus.BuildStartTime | Out-String
# }
# New-UDCard -BackgroundColor white -Title 'Build ETA' -Content { $Cache:KatanaStatus.BuildETA
# }
# New-UDCard -BackgroundColor white -Title Reason -Content { $Cache:KatanaStatus.Reason
# }
}
}
})
Status2 = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint {
$Cache:KatanaStatus = Get-KatanaAgentInfo -agentName $argumentlist.hostname -KatanaServer $argumentlist.katana_server
#Wait-Debugger
Show-UDModal -Header {
New-UDHeading -Size 4 -Text " Status $($ArgumentList.hostname)"
} -Content {
$red = "green"
if ($Cache:KatanaStatus.building) {
$BackGround = "red"
$AgentStatus = 'Agent is building'
}
else {
$BackGround = "green"
$AgentStatus = 'Agent is available'
}
New-UDCard -BackgroundColor "$BackGround" -Title "$AgentStatus" -Content {
New-UDTable -Title "Additional information" -Style striped -Headers @(" ", " ") -Endpoint {
Try {
$Table = [ordered]@{
'Yumi URL' = New-UDLink -Text "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -Url "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -OpenInNewWindow
'Katana URL' = New-UDLink -Text $($Cache:KatanaStatus.KatanaURL) -Url $($Cache:KatanaStatus.KatanaURL) -OpenInNewWindow
'Build URL' = New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
'Builder Name' = $Cache:KatanaStatus.BuilderName
'Build Start Time' = $Cache:KatanaStatus.BuildStartTime | Out-String
'Build ETA' = $Cache:KatanaStatus.BuildETA
'Reason' = $Cache:KatanaStatus.Reason
}
$Table.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
}
Catch {
$Lookup = ' '
$Lookup | Out-UDTableData -Property @("Name", "Value")
}
} -ArgumentList $argumentlist
# New-UDCard -BackgroundColor white -Title 'Yumi URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.YumiURL) -Url $($Cache:KatanaStatus.YumiURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Build URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Builder Name' -Content { $Cache:KatanaStatus.BuilderName
# }
# New-UDCard -BackgroundColor white -Title 'Build Start Time' -Content { $Cache:KatanaStatus.BuildStartTime | Out-String
# }
# New-UDCard -BackgroundColor white -Title 'Build ETA' -Content { $Cache:KatanaStatus.BuildETA
# }
# New-UDCard -BackgroundColor white -Title Reason -Content { $Cache:KatanaStatus.Reason
# }
}
}
})
Status1 = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint {
$Cache:KatanaStatus = Get-KatanaAgentInfo -agentName $argumentlist.hostname -KatanaServer $argumentlist.katana_server
#Wait-Debugger
Show-UDModal -Header {
New-UDHeading -Size 4 -Text " Status $($ArgumentList.hostname)"
} -Content {
$red = "green"
if ($Cache:KatanaStatus.building) {
$BackGround = "red"
$AgentStatus = 'Agent is building'
}
else {
$BackGround = "green"
$AgentStatus = 'Agent is available'
}
New-UDCard -BackgroundColor "$BackGround" -Title "$AgentStatus" -Content {
New-UDTable -Title "Additional information" -Style striped -Headers @(" ", " ") -Endpoint {
Try {
$Table = [ordered]@{
'Yumi URL' = New-UDLink -Text "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -Url "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -OpenInNewWindow
'Katana URL' = New-UDLink -Text $($Cache:KatanaStatus.KatanaURL) -Url $($Cache:KatanaStatus.KatanaURL) -OpenInNewWindow
'Build URL' = New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
'Builder Name' = $Cache:KatanaStatus.BuilderName
'Build Start Time' = $Cache:KatanaStatus.BuildStartTime | Out-String
'Build ETA' = $Cache:KatanaStatus.BuildETA
'Reason' = $Cache:KatanaStatus.Reason
}
$Table.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
}
Catch {
$Lookup = ' '
$Lookup | Out-UDTableData -Property @("Name", "Value")
}
} -ArgumentList $argumentlist
# New-UDCard -BackgroundColor white -Title 'Yumi URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.YumiURL) -Url $($Cache:KatanaStatus.YumiURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Build URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Builder Name' -Content { $Cache:KatanaStatus.BuilderName
# }
# New-UDCard -BackgroundColor white -Title 'Build Start Time' -Content { $Cache:KatanaStatus.BuildStartTime | Out-String
# }
# New-UDCard -BackgroundColor white -Title 'Build ETA' -Content { $Cache:KatanaStatus.BuildETA
# }
# New-UDCard -BackgroundColor white -Title Reason -Content { $Cache:KatanaStatus.Reason
# }
}
}
})
Status = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint {
$Cache:KatanaStatus = Get-KatanaAgentInfo -agentName $argumentlist.hostname -KatanaServer $argumentlist.katana_server
#Wait-Debugger
Show-UDModal -Header {
New-UDHeading -Size 4 -Text " Status $($ArgumentList.hostname)"
} -Content {
$red = "green"
if ($Cache:KatanaStatus.building) {
$BackGround = "red"
$AgentStatus = 'Agent is building'
}
else {
$BackGround = "green"
$AgentStatus = 'Agent is available'
}
New-UDCard -BackgroundColor "$BackGround" -Title "$AgentStatus" -Content {
New-UDTable -Title "Additional information" -Style striped -Headers @(" ", " ") -Endpoint {
Try {
$Table = [ordered]@{
'Yumi URL' = New-UDLink -Text "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -Url "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -OpenInNewWindow
'Katana URL' = New-UDLink -Text $($Cache:KatanaStatus.KatanaURL) -Url $($Cache:KatanaStatus.KatanaURL) -OpenInNewWindow
'Build URL' = New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
'Builder Name' = $Cache:KatanaStatus.BuilderName
'Build Start Time' = $Cache:KatanaStatus.BuildStartTime | Out-String
'Build ETA' = $Cache:KatanaStatus.BuildETA
'Reason' = $Cache:KatanaStatus.Reason
}
$Table.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
}
Catch {
$Lookup = ' '
$Lookup | Out-UDTableData -Property @("Name", "Value")
}
} -ArgumentList $argumentlist
# New-UDCard -BackgroundColor white -Title 'Yumi URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.YumiURL) -Url $($Cache:KatanaStatus.YumiURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Build URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Builder Name' -Content { $Cache:KatanaStatus.BuilderName
# }
# New-UDCard -BackgroundColor white -Title 'Build Start Time' -Content { $Cache:KatanaStatus.BuildStartTime | Out-String
# }
# New-UDCard -BackgroundColor white -Title 'Build ETA' -Content { $Cache:KatanaStatus.BuildETA
# }
# New-UDCard -BackgroundColor white -Title Reason -Content { $Cache:KatanaStatus.Reason
# }
}
}
})
}
}
$YumiGrid | Out-UDGridData
} -PageSize 25 # -AutoRefresh -RefreshInterval 60
}
$EndInit = New-UDEndpointInitialization -Function 'Invoke-ButtonClick'
$ServiceOps = New-UDDashboard -Title "ServiceOps" -Pages $Page -EndpointInitialization $EndInit
Start-UDDashboard -Port 10001 -Dashboard $ServiceOps -Name "ServiceOps" -Force
Good Performance Example:
Import-Module UniversalDashboard
function Invoke-ButtonClick {
param(
$ArgumentList
)
$Cache:KatanaStatus = Get-KatanaAgentInfo -agentName $argumentlist.hostname -KatanaServer $argumentlist.katana_server
#Wait-Debugger
Show-UDModal -Header {
New-UDHeading -Size 4 -Text " Status $($ArgumentList.hostname)"
} -Content {
$red = "green"
if ($Cache:KatanaStatus.building) {
$BackGround = "red"
$AgentStatus = 'Agent is building'
}
else {
$BackGround = "green"
$AgentStatus = 'Agent is available'
}
New-UDCard -BackgroundColor "$BackGround" -Title "$AgentStatus" -Content {
New-UDTable -Title "Additional information" -Style striped -Headers @(" ", " ") -Endpoint {
Try {
$Table = [ordered]@{
'Yumi URL' = New-UDLink -Text "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -Url "https://yumi.bf.unity3d.com/#/agents/$($Argumentlist.Id)" -OpenInNewWindow
'Katana URL' = New-UDLink -Text $($Cache:KatanaStatus.KatanaURL) -Url $($Cache:KatanaStatus.KatanaURL) -OpenInNewWindow
'Build URL' = New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
'Builder Name' = $Cache:KatanaStatus.BuilderName
'Build Start Time' = $Cache:KatanaStatus.BuildStartTime | Out-String
'Build ETA' = $Cache:KatanaStatus.BuildETA
'Reason' = $Cache:KatanaStatus.Reason
}
$Table.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
}
Catch {
$Lookup = ' '
$Lookup | Out-UDTableData -Property @("Name", "Value")
}
} -ArgumentList $argumentlist
# New-UDCard -BackgroundColor white -Title 'Yumi URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.YumiURL) -Url $($Cache:KatanaStatus.YumiURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Build URL' -Content { New-UDLink -Text $($Cache:KatanaStatus.BuildURL) -Url $($Cache:KatanaStatus.BuildURL) -OpenInNewWindow
# }
# New-UDCard -BackgroundColor white -Title 'Builder Name' -Content { $Cache:KatanaStatus.BuilderName
# }
# New-UDCard -BackgroundColor white -Title 'Build Start Time' -Content { $Cache:KatanaStatus.BuildStartTime | Out-String
# }
# New-UDCard -BackgroundColor white -Title 'Build ETA' -Content { $Cache:KatanaStatus.BuildETA
# }
# New-UDCard -BackgroundColor white -Title Reason -Content { $Cache:KatanaStatus.Reason
# }
}
}
}
$Page = New-UDPage -Name 'YumiPage' -Icon link -Content {
# Wait-Debugger
New-UDGrid -Title 'Yumi' -Headers @('Status', 'Status1', 'Status2', 'Status3') -Properties @('Status', 'Status1', 'Status2', 'Status3') -Endpoint {
$YumiGrid = 1..1000 | ForEach-Object -Process {
[PSCustomObject]@{
Status3 = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint { Invoke-ButtonClick -ArgumentList $ArgumentList })
Status2 = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint { Invoke-ButtonClick -ArgumentList $ArgumentList })
Status1 = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint { Invoke-ButtonClick -ArgumentList $ArgumentList})
Status = New-UDButton -Text "Status" -OnClick (New-UDEndpoint -Endpoint { Invoke-ButtonClick -ArgumentList $ArgumentList})
}
}
$YumiGrid | Out-UDGridData
} -PageSize 25 # -AutoRefresh -RefreshInterval 60
}
$EndInit = New-UDEndpointInitialization -Function 'Invoke-ButtonClick'
$ServiceOps = New-UDDashboard -Title "ServiceOps" -Pages $Page -EndpointInitialization $EndInit
Start-UDDashboard -Port 10001 -Dashboard $ServiceOps -Name "ServiceOps" -Force