加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:分配[]或{}贵吗?如何快速重置数字/关联数组?

发布时间:2020-12-16 06:18:16 所属栏目:大数据 来源:网络整理
导读:我有 a card game – 用Perl编写并且只有很少的对象,比如这个: package PlayingTable;our (%Games,$Num);sub new { my $pkg = shift; my $game = { ID = ++$Num,PHASE = WAITING,KIBITZERS = [],PLAYERS = [],INFO = '',RED5 = '',TALON = [],TABLE = {},RO
我有 a card game – 用Perl编写并且只有很少的对象,比如这个:

package PlayingTable;

our (%Games,$Num);

sub new {
        my $pkg   = shift;

        my $game = {
                ID        => ++$Num,PHASE     => WAITING,KIBITZERS => [],PLAYERS   => [],INFO      => '',RED5      => '',TALON     => [],TABLE     => {},ROUND     => 0,PASS_ROUND => 0,START     => undef,TURN      => undef,NPASSED   => 0,HOLDER    => undef,WHISTER1  => undef,WHISTER2  => undef,ACTIVE    => undef,PASSIVE   => undef,SHOW      => undef,BEFORE    => undef,SUIT1     => undef,TRUMP     => undef,WINNER    => undef,};

        $Games{$Num} = $game;
        bless($game,$pkg);
}

在对象中我有很多哈希和列表引用,我经常需要重置.例如,当游戏结束时(一种情况:当所有玩家都通过时),我将只调用$player-> {CARDS} = {};将玩家手牌中的牌数减少到0.

我的问题是,如果分配[]和{}是一个足够好的做法,或者它是否太昂贵,因为perl解释器将在内部使用malloc(或其分配内存的任何内容)那些新的哈希和数组对象(它真的会吗?或者翻译是否足够聪明?).

我正在使用(并且不想升级)库存CentOS perl包:

This is perl,v5.8.8 built for x86_64-linux-thread-multi

使用CentOS 5.6 / 64位,在4GB机器上,最大在晚上同时有500名玩家.我的perl进程(非分叉守护进程,轮询TCP套接字)现在使用:

top - 13:50:07 up 13 days,3:25,1 user,load average: 2.64,3.36,3.46
Tasks: 179 total,2 running,177 sleeping,0 stopped,0 zombie
Cpu0  :  3.6%us,0.3%sy,0.0%ni,96.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st
Cpu1  :  6.0%us,1.3%sy,92.7%id,0.0%st
Cpu2  : 13.7%us,85.3%id,0.7%wa,0.0%st
Cpu3  : 42.7%us,1.7%sy,54.6%id,0.3%hi,0.7%si,0.0%st
Mem:   4018280k total,2831016k used,1187264k free,313128k buffers
Swap:  7999472k total,13612k used,7985860k free,1775196k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13685 afarber   15   0  112m  46m 2704 R 41.8  1.2 176:45.14 pref.pl

谢谢!
亚历克斯

解决方法

rules of optimization是

>不要.
>不要……
>优化前的配置文件

在另一个评论中,你说你没有性能问题,所以你仍然处于规则1.

至于如何清除阵列和散列,有一个潜在的缺陷需要避免.好的做法是始终返回对象私有数据的副本.考虑

#! /usr/bin/env perl

use strict;
use warnings;

package My::Class;

sub new {
  my($class,@a) = @_;
  bless { a => @a } => $class;
}

sub a {
  my($self) = @_;
  $self->{a};
}

package main;

my $obj = My::Class->new(1,2,3);

my $a = $obj->a;
print "@$an";

push @$a,qw/ foo bar /;

my $b = $obj->a;
print "@$bn";

它的输出是

1 2 3
1 2 3 foo bar

返回对私有数据的引用为处理不受控制且可能令人惊讶的修改提供了手柄.

如果您的代码是共享引用,请确保清除相同的数组和哈希,而不是创建对新引用的引用.否则,其他所有人都将继续使用旧数据而不知道有任何改变.用Perl术语来写

@{ $game->{PLAYERS} } = ();

而不是

$game->{PLAYERS} = [];

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读