cjm*_*cjm 13

unpack会比split和更高效ord,因为它不需要制作一堆临时的1个字符的字符串:

use utf8;

my $str = '??c'; # Chinese language of china

my @codepoints = unpack 'U*', $str;

print join(',', @codepoints) . "\n"; # prints 20013,22283,99
Run Code Online (Sandbox Code Playgroud)

快速基准测试显示它比split+ord以下快3倍:

use utf8;
use Benchmark 'cmpthese';

my $str = '????????????????????????????c';

cmpthese(0, {
  'unpack'     => sub { my @codepoints = unpack 'U*', $str; },
  'split-map'  => sub { my @codepoints = map { ord } split //, $str },
  'split-for'  => sub { my @cp; for my $c (split(//, $str)) { push @cp, ord($c) } },
  'split-for2' => sub { my $cp; for my $c (split(//, $str)) { $cp = ord($c) } },
});
Run Code Online (Sandbox Code Playgroud)

结果:

               Rate  split-map  split-for split-for2     unpack
split-map   85423/s         --        -7%       -32%       -67%
split-for   91950/s         8%         --       -27%       -64%
split-for2 125550/s        47%        37%         --       -51%
unpack     256941/s       201%       179%       105%         --
Run Code Online (Sandbox Code Playgroud)

较短的字符串差异不太明显,但unpack速度仍然快两倍.(split-for2比其他拆分快一点,因为它不构建代码点列表.)