in reply to How to optimize perl code

Code would help. From what I can see, you could be trying to run a direct n-body problem with 1010 bodies.

emc

" The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents."
—Nathaniel S. Borenstein

Replies are listed 'Best First'.
Re^2: How to optimize perl code
by srins (Sexton) on Mar 27, 2006 at 20:44 UTC
    package hiXMLDOMParser; our @ISA = qw( hiXMLParser ); require Exporter; require hiXMLParser; use Data::Dumper; use hiErrCode; use XML::DOM; use XML::DOM::NamedNodeMap; use vars qw( $parser, $doc ); #constructor sub new { my $self = {}; bless $self, "hiXMLDOMParser"; $self->init(); return $self; } # init routines sub init { $parser = new XML::DOM::Parser; } ################################################## # Parser XML File # # Parameters : XML File name to parse # Returns : Object to the parsed XML file ################################################## sub parse_file { my ($this, $file_name_wpath) = @_; if (!$parser->isa("XML::DOM::Parser")) { $this->set_hi_errno(HI_XML_PARSE_ERROR); return; } if (!$file_name_wpath) { #print "XML Parser : Invalid file name '$file_name_wpath'\n"; $this->set_hi_errno(HI_FAILURE); return; } if (!(-r $file_name_wpath)) { #print "XML Parser : File '$file_name_wpath' not found.\n"; $this->set_hi_errno(HI_FAILURE); return; } $doc = $parser->parsefile($file_name_wpath); $this->set_hi_errno(HI_SUCCESS); return; } ################################################## # set xml parser ref. # Parameters : hiXMLParser object reference # Returns : None ################################################## sub set_xml_parser_objref { my ($this, $xml_objref) = @_; $parser = $xml_objref; } #sub get_sibling_element_cnts #{ # $sibling_elem_vals{$elem} = $elem_val; #} ##################################################################### # get the sibling elements # # Parameters : Parent element name # Returns : Array of parent sibling elements # On SUCCESS - Array of children # On FAILURE - sets hi_errno to appropriate error code ##################################################################### sub get_sibling_elements { my($this, $parent_elem) = @_; my @sibling_elems = (); my @sibling_elems_ref = $this->get_sibling_elements_objref($parent_elem); if ($this->get_hi_errno() != HI_SUCCESS) { return; } foreach my $node (@sibling_elems_ref) { push(@sibling_elems, $node->getTagName()); } $this->set_hi_errno(HI_SUCCESS); return(@sibling_elems); } ##################################################################### # get the sibling elements by reference # # Parameters : Parent element name # Returns : Array of parent sibling elements object reference # On SUCCESS - Array of children ref # On FAILURE - sets hi_errno to appropriate error code ##################################################################### sub get_sibling_elements_objref { my($this, $parent_elem) = @_; my @sibling_elems_ref = (); # find the given parent element if ($this->is_debug_set) { print __FILE__, ":", "Parent <$parent_elem>\n"; } my $parent_nodes = $doc->getElementsByTagName($parent_elem); if ($parent_nodes->getLength < 1) { $this->set_hi_errno(HI_XML_ELEMENT_NOT_FOUND); return; } my $parent_node = $parent_nodes->item(0); my $child_nodes = $parent_node->getChildNodes(); my $child_len = $child_nodes->getLength(); if ($child_len < 1) { $this->set_hi_errno(HI_XML_NO_CHILDREN); return; } for (my $cnt=0; $cnt<$child_len; $cnt++) { my $node = $child_nodes->item($cnt); my $node_type = $node->getNodeType(); if ($node_type == ELEMENT_NODE) { push(@sibling_elems_ref, $node); } } $this->set_hi_errno(HI_SUCCESS); return(@sibling_elems_ref); } ################################################### # get the sibling values # # Parameters : parent element name # Returns : hash of sibling element/value #################################################### sub get_sibling_values { my($this, $parent_elem) = @_; my %sibling_elem_vals = (); my $elem, $elem_val; #print "<font color=blue>Parent Element '$parent_elem' </font>\n"; # find the given parent element my $parent_nodes = $doc->getElementsByTagName($parent_elem); if ($parent_nodes == undef) { $this->set_hi_errno(HI_XML_NO_CHILDREN); return; } my $parent_len = $parent_nodes->getLength(); #print "<font color=red>Parent Element len '$parent_len' </font>\n +"; my $parent_node = $parent_nodes->item(0); my $child_nodes = $parent_node->getChildNodes(); my $child_len = $child_nodes->getLength(); if ($child_len < 1) { $this->set_hi_errno(HI_XML_NO_CHILDREN); return; } for (my $cnt=0; $cnt<$child_len; $cnt++) { my $node = $child_nodes->item($cnt); if ($node->getNodeType == ELEMENT_NODE) { my $elem = $node->getTagName(); # get the element value my $elem_val = $this->get_element_value($node); if ($sibling_elem_vals{$elem}) { my $tmp_val = $sibling_elem_vals{$elem}; my $new_tmp_val = $tmp_val . ",". $elem_val; $sibling_elem_vals{$elem} = $new_tmp_val; } else { $sibling_elem_vals{$elem} = $elem_val; } if ($this->is_debug_set) { print __FILE__, ":", "Get Value Key <$elem> ", "Value <$elem_val>\n"; } } } $this->set_hi_errno(HI_SUCCESS); return(%sibling_elem_vals); } sub get_value_by_elem_name { my($this, $elem_name) = @_; # find the given parent element my $elem_nodes = $doc->getElementsByTagName($elem_name); if ($elem_nodes == undef) { $this->set_hi_errno(HI_XML_NO_CHILDREN); return; } my $elem_len = $elem_nodes->getLength(); my $elem_node = $elem_nodes->item(0); my $elem_val = $this->get_element_value($node); return($elem_val); } ################################################## # get the element value # # Parameters : element node # Returns : # On SUCCESS - Value of the given element # the array will contain only one value. # On FAILURE - HI_XML_ELEMENT_NOT_FOUND ################################################## sub get_element_value { my($this, $elem_node) = @_; if (!$elem_node->isa("XML::DOM::Element")) { $this->set_hi_errno(HI_XML_NOT_AN_ELEMENT); return; } my $elem_name = $elem_node->getTagName(); if ($this->is_debug_set) { print __FILE__, ":", "get_element_value : <$elem_name>\n"; } # get the text nodes my @child_nodes = $elem_node->getChildNodes(); my $elem_val; #foreach $child_node (@child_nodes) #{ my $child_node = $elem_node->getFirstChild(); if ($child_node == undef) { $this->set_hi_errno(HI_XML_NO_CHILDREN); return; } if ($child_node->getNodeType() != TEXT_NODE) { $this->set_hi_errno(HI_XML_CHILD_NOT_A_TEXT); return; } # get the value of the element if ($elem_val) { $elem_val = $elem_val . "," . $child_node->getData(); } else { $elem_val = $child_node->getData(); } #} $this->set_hi_errno(HI_SUCCESS); return($elem_val); } ###################################################################### # get the element attributes # # Parameters : Element name # Returns : Hash of attribute key/value pair ###################################################################### sub get_element_attribs { my($this, $elem_name) = @_; my %elem_attribs= (); # Get the child nodes my $elem_nodes = $doc->getElementsByTagName($elem_name); if ($elem_nodes == undef) { $this->set_hi_errno(HI_XML_ELEMENT_NOT_FOUND); return; } # Get the first matching element my $elem_node = $elem_nodes->item(0); if ($elem_node->getNodeType == ELEMENT_NODE) { # get the element name my $parsed_elem_name = $elem_node->getTagName(); if ($this->is_debug_set) { print __FILE__, ":", "Get Elem Attrib - ", "Element Name '$parsed_elem_name'\n"; } # get the element attributes my $elem_attr_map = $elem_node->getAttributes(); my @elem_attrs = $elem_attr_map->getValues(); if ($this->is_debug_set) { print "_"x25, "\n"; } foreach my $attr (@elem_attrs) { my $attr_name = $attr->getNodeName(); my $attr_value = $attr->getNodeValue(); if ($this->is_debug_set) { print "Attrname '$attr_name' AttrValue '$attr_value'\n +"; } $elem_attribs{$attr_name} = $attr_value; } if ($this->is_debug_set) { print "_"x25, "\n"; } } $this->set_hi_errno(HI_SUCCESS); return(%elem_attribs); } ################################################## # get the XML parser version # # Parameters : None # Returns : The XML Parser version used ################################################## sub get_version { return($XML::DOM::VERSION); }