当前位置:  开发笔记 > 编程语言 > 正文

Elixir中BitString的位计数或汉明重量?

如何解决《Elixir中BitString的位计数或汉明重量?》经验,为你挑选了1个好方法。



1> Patrick Osci..:

这是一个性能更好的解决方案,(对我而言)也更清楚地表明了意图:

for(<>, do: bit) |> Enum.sum

使用具有100.000二进制数字的benchfella进行基准测试:

Benchfella.start

defmodule HammingBench do
  use Benchfella

  @n Stream.repeatedly(fn -> Enum.random [0, 1] end)
    |> Enum.take(100_000)
    |> Enum.join
    |> String.to_integer(2)

  bench "CharlesO" do
    Enum.count(Integer.to_char_list(@n,2),&(&1===49)) 
  end

  bench "Patrick Oscity" do
    for(<>, do: bit) |> Enum.sum
  end
end

基准测试结果:

$ mix bench
Compiled lib/hamming_bench.ex
Generated hamming_bench app
Settings:
  duration:      1.0 s

## HammingBench
[20:12:03] 1/2: Patrick Oscity
[20:12:06] 2/2: CharlesO

Finished in 8.4 seconds

## HammingBench
Patrick Oscity         500   4325.79 µs/op
CharlesO                 1   5754094.00 µs/op


实现的最慢部分是将整数转换为字符列表。另一方面,二进制模式匹配是高度优化的。但是,对于少量数字,性能差异可以忽略不计。
Protip:如果你把代码放在`bench/hamming_bench.exs`文件中,你不需要手动调用`Benchfella.start`.
对于所有希望了解加速原因的读者,请访问https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/elixir-lang-talk/uKkM0XMDAC0/culTFWF-AgAJ
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有