Пример на TechNet довольно глупый, потому что числа уже имеют тип System.Int32
.Взгляните на этот пример:
PS C:\Users\andy> [math]::floor( 100 / 26 ).GetType().Fullname
System.Double
PS C:\Users\andy> (100).GetType().FullName
System.Int32
PS C:\Users\andy> [int].FullName
System.Int32
Так что совершенно необязательно ставить [int]
перед параметрами метода Floor, потому что они уже имеют тип System.Int32
.
Кроме того,в любом случае вы не захотите приводить возвращенное System.Double
к Int32
, потому что возвращаемое значение может быть больше, чем может содержать Int32
.Например:
PS C:\Users\andy> [int][math]::floor( ([int]::MaxValue + 1) / 1 )
Cannot convert value "2147483648" to type "System.Int32". Error: "Value was either too large or too small for an Int32."
Что касается производительности, разница в скорости незначительна.Движок PowerShell выполняет множество типов адаптации и приведения за кулисы вне зависимости от того, хотите вы этого или нет ... Он был спроектирован таким образом, чтобы системным администраторам не приходилось слишком сильно беспокоиться о типах int, double, decimals и т. Д. ...Число это число верно?;-) Например:
[Math]::Floor("123")
# This outputs 123 as System.Double.
Это даже не скомпилируется в C #.Среда выполнения PowerShell выполняет необходимое приведение в соответствие с сигнатурой метода Floor.
Другой пример:
"2" / "1"
# This outputs 2 as System.Int32.
Деление со строками невозможно, но механизм PowerShell выполняет преобразование в фоновом режиме, чтобы вы могли выполнить эту работу.
Вотрезультаты производительности с моей машины:
function Get-SingleCastTime {
$runtime = Measure-Command {
1..10000 | ForEach-Object {
Foreach ($divisor in 2,3,5,7) {
[int][Math]::Floor($_ / $divisor) > $null
}
}
}
"Single Cast: $($runtime.TotalMilliSeconds)"
}
function Get-DoubleCastTime {
$runtime = Measure-Command {
1..10000 | ForEach-Object {
Foreach ($divisor in 2,3,5,7) {
[Math]::Floor([int]$_ / [int]$divisor) > $null
}
}
}
"Double Cast: $($runtime.TotalMilliSeconds)"
}
Get-SingleCastTime
#Single Cast: 614.6537
Get-DoubleCastTime
#Double Cast: 545.2668
Get-DoubleCastTime
#Double Cast: 514.2103
Get-SingleCastTime
#Single Cast: 526.9188