FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Dr. Boris Neubert am 07 Mai 2017, 11:38:43

Titel: Durchreichen von Arrays in Subroutine beschleunigen
Beitrag von: Dr. Boris Neubert am 07 Mai 2017, 11:38:43
Hallo,

ich habe in einem Modul einen rekursiven Aufruf einer Funktion parseSub(), bei der ich ein Array durchreiche. Bei einem Array mit wenigen hundert Strings dauert das Dereferenzieren auf einem i7 ca. 300 ms und auf einem Raspi B2+ 5 Sekunden (siehe bitte mit "langsam" markierte Stelle im Kode unten).

Hat jemand eine Idee, wie ich das beschleunigen könnte?

Es ergibt übrigens keinen Unterschied, ob ich die Referenz oder das Array durchreiche.

Viele Grüße
Boris

sub parse($$) {
  my ($self,@ical)= @_;
  return $self->parseSub(0, \@ical);
}

sub parseSub($$$) {
  my ($self,$ln,$icalref)= @_;
  my @ical= @{$icalref};   # langsam!
  ...
      $ln= $entry->parseSub($ln,$icalref);
  ...
}
Titel: Durchreichen von Arrays in Subroutine beschleunigen
Beitrag von: justme1968 am 07 Mai 2017, 11:46:22
hallo boris,

warum dereferenzierst du denn die ref und legst eine array kopie an?

du kannst doch direkt auf der referenz arbeiten. dann wird nichts kopiert.

gruss
  andre
Titel: Antw:Durchreichen von Arrays in Subroutine beschleunigen
Beitrag von: Dr. Boris Neubert am 07 Mai 2017, 12:20:39
Danke, Andre. Ich habe das Offensichtliche übersehen. Geht.

Für die Nachwelt:

  my $len= scalar @$icalref;
  my $line= $$icalref[$ln];



Grüße
Boris