PowerShell 应该像这样打印所有带前导零的 16 位二进制数:
0000000000000000
0000000000000001
0000000000000010
0000000000000011
...
1111111111111100
1111111111111101
1111111111111110
1111111111111111
我当前的代码如下所示:
0 .. 65535 | % { "{0:D16}" -f [int64][convert]::ToString($_,2) }
但我想知道是否有其他算法可以更快地执行任务。
最佳答案
tl;dr 以下使用缓存和数组查找的方法速度更快,但由于其他瓶颈可能无法实现。
这是一个使用缓存的版本。但是,根据 Measure-Command
,没有显着改进(3.5 秒对 3.8 秒)- 我期望看到更大的差异。
$l = @(0) * 256
0..255 | % {
$l[$_] = "{0:D8}" -f [int64][convert]::ToString($_,2)
}
0 .. 65535 | % {
$l[$_ / 256 ] + $l[$_ -band 255] # no -shr in PS before 3.0
}
这个问题有两个“慢”部分。一是与普通循环相比,%{}
的使用慢。使用上面修改为以下内容(这不是很有用)在 0.3 秒内完成。
For ($i = 0; $i -lt 65535; $i = $i + 1) {
$line = $l[$i / 256 ] + $l[$i -band 255]
}
虽然经过类似修改但同样无用的原始版本在 0.5 秒内完成。这比缓存的提议版本慢了很多,即使提议的方法最终不会影响瓶颈或挂钟。
For ($i = 0; $i -lt 65535; $i = $i + 1) {
$line = "{0:D16}" -f [int64][convert]::ToString($i,2)
}
使用预置数组手动收集输出也比 %{}
快得多,对于我的版本,它在 0.5 秒内运行 - 对于原始方法,它会运行得慢一些,比如说0.8 秒。
$r = @("") * 65536
# ..
For ($i = 0; $i -lt 65535; $i = $i + 1) {
$r[$i] = $l[$i / 256 ] + $l[$i -band 255]
}
其次,使用 Write-Output
实际实现非常慢并且比使用 %{}
收集结果要慢。使用 Write-Output
或 Write | Output-File ..
结果超过 8 秒。
$r = @("") * 65536
$l = @(0) * 256
For ($i = 0; $i -lt 256; $i = $i + 1) {
$l[$i] = "{0:D8}" -f [int64][convert]::ToString($i, 2)
}
For ($i = 0; $i -lt 65535; $i = $i + 1) {
$r[$i] = $l[$i / 256 ] + $l[$i -band 255]
}
# to here in about 0.5 seconds
Write $r | Out-File results.txt
# almost another 8 seconds to get here
关于algorithm - 在 Powershell 中打印所有 16 位二进制数的最快算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25415641/