effizienzfrage zu threads



  • also ich hab nen rekursiven algorithmus mit threads implementiert.
    der code ist glaub ich net wichtig weil der algorithmus funktioniert.
    Jetzt die Frage:
    In jedem Rekursionsaufruf, werden zwei neue Aufrufe erzeugt (Ausser er bricht ab dann gibts halt keine).
    Ist es effizienter beide Aufrufe, jeweils einem neuen Thread zu übergeben, oder
    sollte man dem aktuell laufenden Ur-Thread, also der der diese Funktionen aufruft,eine Rekursion überlassen und die andere einem neuen Thread ?
    Oder grob gesagt ein oder zwei neue Threads?
    danke im vorraus
    ps: cool wäre natürlich zu erfahren warum so und nicht anders!



  • ist meiner meinung nach nicht pauschal zu beantworten.

    n paar punkjte zum überdenken:
    1. bei jedem thread wird n neues object angelegt.
    - s dauerts ne zeit, das object anzulegen
    - s braucht zusätzlichen speicher. bei rekursion bist du je nach rekursionstiefe manchmal ziemlich schnell am speicherüberlauf.
    2. sind in der methode überhaupt sachen, bei denen eine nebenläfigkeit vorteile bringt(graphik, festplattenzugriffe...). wenn der prozessor sowiso ausgelastet ist bringen dich threads eh nich weiter.
    3. wenn n paar rekursionen duchlaufen werden ist das ne schöne sache zum messen und testen, da es eh ne weile dauert.
    4. stell ich mir das threading in ner rekursion nich allzu einfach vor zur (synchronisierung / rückgabeparameter...)(nich weiter drüber nachgedacht. 🙂 )



  • zu 1) gut also möglichst wenig neue threads
    zu 4)ja sie haben alle einen array auf den sie zugreifen, allerdings ist sichergestellt, dass die threads nie gleichzeitig auf den selben abschnitt zugreifen. Und da es ohne synchronized klappt bin ich davon ausgegangen, dass ichs weglassen kann.





  • N.E.R.D. schrieb:

    [...] Und da es ohne synchronized klappt bin ich davon ausgegangen, dass ichs weglassen kann.

    würd ich mich nicht drauf verlassen. du kannst ja nie wissen, wann genau welcher thread was macht und es muss auch nicht unbedingt knallen, wenn konkurrierende zugriffe auftreten. im schlimmsten fall ist einfach dein ergebnis verfälscht, ohne dass eine exception geworfen wird.

    macht es denn überhaupt sinn, dass die rekursionen parallel laufen? was ist das denn für ein algorithmus?


Anmelden zum Antworten