使用可变宽度编码的Ruby字符串索引

时间:2013-12-05 22:13:41

标签: ruby string encoding utf-8

这个问题与固定宽度(即UTF-32)与variable width(即UTF-8)编码字符串的性能有关。

具体来说,如果我有一个包含1024个字符(不是字节,字符)的Ruby字符串,并且想获得第1000个字符,那么它是否必须从字符串的开头读取并查看每个引导单元知道在下一个字符到达下一个字符之前要扫描多少字节?

如果您不确定我在说什么,wikipedia variable-width encoding page可以很好地解释这一点。

我整理了一个基准测试,看看索引到特定字符串的字符需要多长时间,并在下面列出了源和结果。请注意,我使用 a 来确保我有一个潜在客户情况。

require 'benchmark'

def my_test(encoding, character)
  str = (character * 1024).encode(encoding)
  result =  Benchmark.measure { 
    (1..1000000).each do 
      str[1000]
    end
  }
  puts "Encoding: #{encoding.ljust(10)}  Character: #{character.ljust(2)}   Seconds: #{result}"
end

my_test 'UTF-8', 'a'
my_test 'UTF-16', 'a'
my_test 'UTF-32', 'a'
my_test 'Shift_JIS', 'a'
my_test 'US-ASCII', 'a'
my_test 'IBM437', 'a'

puts "------------"

my_test 'UTF-8', '渥'
my_test 'UTF-16', '渥'
my_test 'UTF-32', '渥'
my_test 'Shift_JIS', '渥'

结果:

注意在单身区域内,UTF-8如何通过头发击败UTF-16/32,但在引导单位区域内需要花费更长时间。 enter image description here

0 个答案:

没有答案