- Perlについての質問箱 64箱目 [転載禁止]©2ch.net
365 :デフォルトの名無しさん[sage]:2015/08/26(水) 12:19:13.34 ID:g32nt69a - # 以下の記述があからさまに遅いです。(Perlのループ自体が遅いです)
# なにか速くなる方法のご提案があればよろしくお願いします。 # 普段、楽な記述を優先させているため、速くするための妥当な記述がよくわかりません。(何をやってもどうでもいいから速くするならいろいろ手はあるのですが) # あとおそらく意図した通りに動いてるとは思いますが、これはあからさまに違うだろってのがもしあれば、お願いします。 # なお、pack_widget_all は何度も呼び出されるほか、一度の呼び出しでの出力量が2万行前後です。 #-------------------------------------------- open G_OUT, ">", "g_out.txt"; sub out_print{ while(my $line = shift @::out){ print G_OUT $line . "\n"; #デバッグ用。あまりに大量送信されるので不要な時は消しておく。 print $line . "\n"; } } { #▼%::widgetが保持してるものを成型して送信 my %back; #前回と同じデータを再出力しないための記憶 (受信側が、同じ物と違う物の区別を付けずに全く同じ処理をやり直してしまうため)。 sub pack_widget_all { foreach my $name (keys %::widget){ foreach my $name2 (keys %{ $::widget{$name}->[1] }){ my $back = join ',', @{ $::widget{$name}->[1]->{$name2} }; next if($back{$name}->{$name2} eq $back); #; 前回と同じ物は再出力しない $back{$name}->{$name2} = $back; push @::out, (join ',', $name2, $::widget{$name}->[0], $back); out_print; #受信側の都合上、小刻みに何度も出力したほうが速かった。perl側やこの質問には関係ない } } push @::out, "pack_widget"; out_print; } }
|