algorithm - 在 Powershell 中打印所有 16 位二进制数的最快算法?

标签 algorithm powershell optimization binary

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-OutputWrite | 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/

相关文章:

javascript - 关于优化 for-in 语句

多行斜接连接的算法

java - 优化此解决方案 : Longest consecutive distinct sequence of integers

algorithm - fminunc 的 Matlab 函数梯度

java - 当必须通过姓名和号码访问时,存储电话簿的最佳数据结构

打包在批处理文件中的PowerShell脚本只执行了一半

PowerShell 将字符串附加到 .txt 文件并省略空格

PowerShell 模块部署复制

optimization - 汉明距离和

optimization - 使用 R 拆分字符串和计数字符的更快方法?