Durchreichen von Arrays in Subroutine beschleunigen

Begonnen von Dr. Boris Neubert, 07 Mai 2017, 11:38:43

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

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);
  ...
}
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

justme1968

#1
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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dr. Boris Neubert

Danke, Andre. Ich habe das Offensichtliche übersehen. Geht.

Für die Nachwelt:

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



Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!