Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 解码utf8消耗执行时间_Performance_Perl_Profiling_Execution Time - Fatal编程技术网

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";
}