7

示例代码:

# Step 1
$start = get-date
for($i=1; $i -le 1000000; $i++){}
$end = get-date
($end-$start).TotalMilliseconds
Remove-Variable i

# Step 2
$start = get-date
for([int]$i=1; $i -le 1000000; $i++){}
$end = get-date
($end-$start).TotalMilliseconds
Remove-Variable i

# Step 3
$start = get-date
for([int64]$i=1; $i -le 1000000; $i++){}
$end = get-date
($end-$start).TotalMilliseconds
Remove-Variable i

# Step 4
$start = get-date
for([float]$i=1; $i -le 1000000; $i++){}
$end = get-date
($end-$start).TotalMilliseconds
Remove-Variable i

# Step 5
$start = get-date
for([double]$i=1; $i -le 1000000; $i++){}
$end = get-date
($end-$start).TotalMilliseconds
Remove-Variable i

# Step 6
$start = get-date
for($i=1; $i -le 1000000; $i++){}
$end = get-date
($end-$start).TotalMilliseconds
Remove-Variable i

结果:

1845.1056
3160.1808
5029.2877
5521.3158
4504.2576
1804.1032

毫无疑问,步骤 2-6 之间的差异。但是 1 和 2 和 6 之间的差异是莫名其妙的:在这些情况下,$i 的类型为“System.Int32”。

4

1 回答 1

4

如果您想很好地解释第 1 步和第 2 步之间的区别,只需在命令提示符下尝试:

Remove-Variable i
Trace-Command -Name TypeConversion -Expression {for($i=1; $i -le 1000000; $i++){}} -PSHost

进而 :

Remove-Variable i
Trace-Command -Name TypeConversion -Expression {for([int]$i=1; $i -le 1000000; $i++){}} -PSHost

这证实了@zdan 假设差异在于每个循环中完成的演员表。步骤 1 和 6 相同。

于 2012-10-31T20:20:32.310 回答