Ruby 从一组浮点值中提取舍入参数
给定以下浮点值:Ruby 从一组浮点值中提取舍入参数,ruby,crystal-lang,floating-point-conversion,Ruby,Crystal Lang,Floating Point Conversion,给定以下浮点值: n00.0, n0.0, n.0, 0.n, 0.0n, 0.00n, 0.000n 其中n可以是1、2或5,提取用作舍入参数的相应整数值的最智能、最快速的方法是什么 -2, -1, 0, 1, 2, 3, 4 目前,我使用的是一个哈希表:快速,但我认为不是那么聪明 我认为使用散列是一种很好的方法,并且怀疑它是否会被-Math.log10(k).floor所超越,因此我运行了以下基准测试 构造散列 为基准构建测试阵列(1500万个元素) 执行基准测试 我目前使用的是Cr
n00.0, n0.0, n.0, 0.n, 0.0n, 0.00n, 0.000n
其中n可以是1、2或5,提取用作舍入参数的相应整数值的最智能、最快速的方法是什么
-2, -1, 0, 1, 2, 3, 4
目前,我使用的是一个哈希表:快速,但我认为不是那么聪明 我认为使用散列是一种很好的方法,并且怀疑它是否会被
-Math.log10(k).floor
所超越,因此我运行了以下基准测试
构造散列
为基准构建测试阵列(1500万个元素)
执行基准测试
我目前使用的是Crystal Lang(或Ruby)。目前浮点值,但可能是字符串。
Number#personalize
的实现应该会给人一些启发:-Math.log10(value).floor
成功了!比散列快60倍以上。感谢您向Crystal提交了基准测试,那里的哈希似乎慢了4倍,但我不是100%相信我欺骗了LLVM消除了所有代码(最幼稚的端口让它意识到log10操作的结果从未被读取,只是完全消除了它,这可能就是60x注释的来源).请注意,问题也标有crystal lang。Crystal是一种作为前端实现的编程语言,请参见
h = { 100.0=>-2, 10.0=>-1, 1.0=>0, 0.1=>1, 0.01=>2,
200.0=>-2, 20.0=>-1, 2.0=>0, 0.2=>1, 0.02=>2,
500.0=>-2, 50.0=>-1, 5.0=>0, 0.5=>1, 0.05=>2 }
n = 1_000_000
(arr = h.keys.flat_map { |k| [k]*n }.shuffle).size
#=> 15_000_000
arr.first(10)
#=> [20.0, 0.02, 5.0, 0.5, 0.02, 0.05, 500.0, 50.0, 50.0, 20.0]
arr.last(10)
#=> [500.0, 0.5, 0.1, 20.0, 0.01, 0.1, 500.0, 50.0, 0.05, 0.5]
require 'fruity'
compare(
hash: -> { arr.each { |k| h[k] } },
log10: -> { arr.each { |k| -Math.log10(k).floor } }
)
Running each test once. Test will take about 42 seconds.
hash is faster than log10 by 60.0% ± 10.0%