Performance 解码utf8消耗执行时间
下面是我一直致力于提高其速度的代码片段Performance 解码utf8消耗执行时间,performance,perl,profiling,execution-time,Performance,Perl,Profiling,Execution Time,下面是我一直致力于提高其速度的代码片段 use strict; use warnings; use Encode; open(IN,"<utf8",$ARGV[0]) or die "Cannot open $ARGV[0]:$!\n"; ##treat it as a huge data of 35,000 lines in devnagari script. my @in = <IN>; close(IN); my $key = "अच्छा"; #key to be
use strict;
use warnings;
use Encode;
open(IN,"<utf8",$ARGV[0]) or die "Cannot open $ARGV[0]:$!\n"; ##treat it as a huge data of 35,000 lines in devnagari script.
my @in = <IN>;
close(IN);
my $key = "अच्छा"; #key to be matched contains devanagari script as a string
foreach my $in(@in) {
chomp($in);
$key = decode_utf8($key);
$in = decode_utf8($in);
if($key eq $in) {
print "$key: matched\n";
}
else {
print "Not matched\n";
}
}
使用严格;
使用警告;
使用编码;
打开(在,“
结果是解码utf8占用了34%的时间
是的,基本上你的程序就是这么做的
更重要的是,您的代码有缺陷。您正在解码以前解码的字符串
- 在读取文件内容时对其进行解码(通过
:utf8
),然后对循环中已解码的内容进行解码
- 每次通过循环时,您都要对
$key
的内容进行解码,这样在第四次通过时,您就可以使用解码utf8(解码utf8(解码utf8(解码utf8($key)))
修正:
使用utf8;#使用UTF-8编码的源代码。
使用open':std',':encoding(UTF-8);#术语提供并期望UTF-8。文件的默认值。
严格使用;
使用警告;
我的$key=”अच्छा";
我的$found=0;
while(我的$line=){
chomp($line);
如果($line eq$key){
$found=1;
最后;
}
}
如有($已找到){
打印“找到匹配项\n”;
否则{
打印“不匹配\n”;
}
这也解决了其他问题:
- 对输出进行编码(使用
使用open':std'
)
- 不必使用全局变量。(使用
open my$IN
而不是open IN
)
- 不会不必要地将整个文件加载到内存中
- 不会不必要地读取整个文件
- 找到密钥时,不打印
不匹配的34999次
- 避免使用
:utf8
而支持:编码(UTF-8)
- 不会重新发明
不会在一行中隐藏<代码>模具<代码>。(在代码>或模具< /代码>之前设置一行断线)
- 不使用“不能”。(使用“不能”!)
如果您在文件句柄上使用PerlIO层,则解码将为您完成。(虽然utf8
没有任何意义。您可能指的是:utf8
,即使您确实想要:encoding(utf8)
)如果源代码中有Unicode字符,则需要使用utf8;
。如果不需要,则不应该将整个文件读入内存,也不应该有同名的数组和标量,因为这很容易混淆。而且,尽管代码有明显的错误,但总运行时间仍然不到一秒d、 为什么它需要比这更快呢?不必详细讨论UTF-8和解码/编码问题……您可以将解码时间减少一半:您在$key上每次迭代都调用该函数,通常(对于任何函数),您可以将其移出循环并使用我的$key\u decoded=decode\u utf8($key)。然后在循环内部使用$key_decoded与$in进行比较。@matt这里发布的代码执行时间只是一个实际的工作示例,实时大约需要20秒(大型数据库).我有一个主文件,用utf8打开文件,在另一个子程序中调用decode\u utf8。这里的问题是我不想从文件所在的位置编辑主文件opened@vanHoesel是的,它在循环中。我只是准备了一个片段,让这里的用户了解它执行所花费的时间。我想知道您已经更改了原始代码的意图。您不是在每一行中查找$key
,而是在整个文件中只匹配一次。@Matt Jacob,您的代码是反向的。原始代码有问题,我生成了生成预期结果的代码。没有理由相信OP想要打印匹配数。即使打印了,if
的仍应移到循环之外。(只需将$found=1;last;
替换为+$found;
)嘿,如果检查真的应该在循环中,OP已经知道如何做了,所以没有丢失任何东西。@ikegami我想复制一个最小的、可验证的工作示例来重现这个问题。因此代码看起来有问题。实际上,所有这些都发生在多个子例程中。我曾有意在源代码中放置utf8,但实际上是这样的变量也是从一个文件中分配的。另外,请阅读我向其他用户澄清的注释。我不明白你的意思。你的注释想说什么?如果你的bug实际上跨越了子例程,为什么你认为这很重要?你是否已经像我向你展示的那样修复了它们?你的其他注释也不相关,所以我不确定你为什么要这么做也可以打电话给他们。除了一些输入来自数据库的事实之外。因为再一次,让数据库驱动程序为您解码要干净得多。我的意思是为了让这些错误遇到的例子最少。我修复了将整个文件加载到内存中的问题。但我仍然坚持使用utf8。我正在尝试找到我在做什么在正在使用的子例程中处理utf8时。@ikegami
use utf8; # Source code encoded using UTF-8.
use open ':std', ':encoding(UTF-8)'; # Term provides and expects UTF-8. Default for files.
use strict;
use warnings;
my $key = "अच्छा";
my $found = 0;
while (my $line = <>) {
chomp($line);
if ($line eq $key) {
$found = 1;
last;
}
}
if ($found) {
print "Match found\n";
else {
print "No match\n";
}