tag:forum.selfhtml.org,2005:/self Zeiger Wettrennen – SELFHTML-Forum 2019-02-13T12:43:25Z https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742403#m1742403 pl http://rolfrost.de/ddrende.html 2019-02-10T18:12:33Z 2019-02-10T18:12:33Z Zeiger Wettrennen <p>Also ich habe da in einer Anwendung (in C) eine verkettete Liste mit mehreren tausend Einträgen. Um bestimmte Einträge da rauszufischen rennt ein Zeiger los und wenn das Gesuchte gefunden wurde kommt die Funktion damit zurück. Nun hab' ich mir gedacht, warum nicht gleich mehrere Zeiger auf die Liste loslassen. Gedacht getan und ich bin bereit zu schwören, das geht jetzt flotter. Aber ich habe da so meine Zweifel: Rennen die wirklich zur gleichen Zeit los? Immerhin stehen die Funktionsaufrufe ja untereinander und es ist einunddieselbe Funktion. Soll ich da vielleicht mehrere Funktionen bereitstellen, bringt das was?</p> <p>Danke für Hinweise, MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742404#m1742404 Christian Kruse https://wwwtech.de/about 2019-02-10T18:22:43Z 2019-02-10T18:22:43Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <p>Nun hab' ich mir gedacht, warum nicht gleich mehrere Zeiger auf die Liste loslassen. Gedacht getan und ich bin bereit zu schwören, das geht jetzt flotter.</p> </blockquote> <p>Nicht schwören. Messen.</p> <blockquote> <p>Aber ich habe da so meine Zweifel: Rennen die wirklich zur gleichen Zeit los? Immerhin stehen die Funktionsaufrufe ja untereinander und es ist einunddieselbe Funktion.</p> </blockquote> <p>Wenn du keinen Mechanismus zur Parallelisierung eingebaut hast (etwa Threads, da du ja C programmierst), ist das äusserst fraglich. Es ist prinzipiell möglich, dass der Prozessor da optimiert und in einer zweiten Pipeline schonmal das Ergebnis des zweiten Funktionsaufrufs gleichzeitig berechnet, das ist aber dann eine Optimierung, die die CPU nur unter bestimmten Umständen machen kann. Darauf verlassen würde ich mich nicht. Und für wahrscheinlich halte ich das hier auch nicht.</p> <blockquote> <p>Soll ich da vielleicht mehrere Funktionen bereitstellen, bringt das was?</p> </blockquote> <p>Nein. Du brauchst dann Nebenläufigkeit, etwa in Form von Threads. Aber Vorsicht, das bringt eine ganze Menge eigener Tücken mit sich.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742407#m1742407 TS ts-self@online.de https://bitworks.de 2019-02-10T19:29:05Z 2019-02-10T19:31:08Z Zeiger Wettrennen <p>Hello,</p> <p>ich hätte dazu mehrere Fragen:</p> <ol> <li>Wie lange soll die Liste bestehen? Wird sie während ihrer Lebensdauer mehrfach durchsucht?</li> <li>Ist die Liste sortiert, bzw. indiziert?</li> <li>Um welche Datentypen handelt es sich? Sind diese ggf. sogar ordinal?</li> <li>Könntest Du die Liste als (balncierten) Baum aufbauen?</li> </ol> <p>Mehrere Zeiger hat mMn keinen Nutzen. Die Gesamtzahl der benötigten Taktzyklen wird durch Nebenläufigkeit nicht geringer, eher höher, da die Mutual Exclusion (Supervisor) auch kostet.</p> <p>Als Anregung könntest Du dir mal im Reverse Engeneering anschauen, wie PHP das mit seinen "Array"-Strukturen macht. Das sind verschachtelte (sortierte) Listen von Hashes der Werte. Wo das eigentliche Datenelement dann im Speicher liegt, ist sekundär.</p> <p>Das vermindert die Anzahl der Peeks erheblich, je nach Aufteilung der Blätter.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742405#m1742405 pl http://rolfrost.de/ddrende.html 2019-02-10T18:27:11Z 2019-02-10T18:27:11Z Zeiger Wettrennen <p>Danke für die Info! Threads, ja, damit kann ich was anfangen. MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742414#m1742414 Rolf B 2019-02-10T21:52:09Z 2019-02-10T21:52:09Z Zeiger Wettrennen <p>Hallo pl,</p> <p>die Komplexität, die Du Dir durch eine nebenläufige Logik einfängst, ist beachtlich. Angesichts der Stolperfallen, die Du Dir bisher durch Deinen begrenzten Kenntnisstand in C-Programmierung eingefangen hast (sorry, will nicht böse sein, aber die Fragen die Du gestellt hast waren relativ nah am Einsteigerlevel), würde ich Dir von diesem Abenteuer abraten. Es ist zwar genau das: spannend, interessant und lehrreich, aber die tollen Geschichten erzählt man nur von den erfolgreichen Abenteurern. Und das sind mutmaßlich unter 10% </p> <p>Die alternative Entwicklungsrichtung hat Tom aufgezeigt: Ist die lineare Liste die beste Struktur für deine Daten? Die Suche ist eine O(n) Operation. Welche Operationen führst Du primär auf ihr aus? Kann ein Ersatz durch eine Hashtable sinnvoll sein, oder durch geschachtelte Listen (a.k.a. n-Tree)? Ziel wäre, durch geschickte Organisation das Durchsuchen der vollständigen Liste zu vermeiden und nur einen geringen Teil der Einträge durchlaufen zu müssen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742409#m1742409 Christian Kruse https://wwwtech.de/about 2019-02-10T19:52:30Z 2019-02-10T19:58:56Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <p>Mehrere Zeiger hat mMn keinen Nutzen. Die Gesamtzahl der benötigten Taktzyklen wird durch Nebenläufigkeit nicht geringer, eher höher, […]</p> </blockquote> <p>Die Gesamtzahl der notwendigen Zyklen ist für die Performance der Software aber ggfls überhaupt nicht relevant.</p> <blockquote> <p>da die Mutual Exclusion (Supervisor) auch kostet.</p> </blockquote> <p>Mutual exclusion wird idR erstens nicht durch supervising sichergestellt, sondern durch Locks (z.B. in Form von Mutexes) und zweitens ist das je nach Anwendungsfall auch gar nicht nötig. Read-only access darf durchaus konkurrierend stattfinden.</p> <p>Ob das hier der Fall ist und ob hier Threading überhaupt Sinn macht, weiß ich nicht. Deshalb habe ich das auch nicht kommentiert. Wir wissen nur, dass Rolf mehrere Werte sucht. Da <em>kann</em> Nebenläufigkeit Sinn machen.</p> <blockquote> <p>Als Anregung könntest Du dir mal im Reverse Engeneering anschauen, wie PHP das mit seinen "Array"-Strukturen macht. Das sind verschachtelte (sortierte) Listen von Hashes der Werte.</p> </blockquote> <p>Nein, das sind Hash-Tabellen. Der Hash-Wert des Keys ergibt die Zelle (das Bucket) des Wertes in der Tabelle. Deine Listen kommen bei PHP erst zum Einsatz, wenn es doppelte Hash-Werte für unterschiedliche Keys gibt - Kollisionen.</p> <p>Die Unterscheidung ist insofern wichtig, als dass für Hash-Tables der Aufwand für den Zugriff O(1) ist; bei Listen ist er O(n).</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742432#m1742432 pl http://rolfrost.de/ddrende.html 2019-02-11T07:06:05Z 2019-02-11T07:06:05Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <p>ich hätte dazu mehrere Fragen:</p> <ol> <li>Wie lange soll die Liste bestehen? Wird sie während ihrer Lebensdauer mehrfach durchsucht?</li> <li>Ist die Liste sortiert, bzw. indiziert?</li> <li>Um welche Datentypen handelt es sich? Sind diese ggf. sogar ordinal?</li> <li>Könntest Du die Liste als (balncierten) Baum aufbauen?</li> </ol> </blockquote> <p>Ja, sowas lernt man in der Schule.</p> <blockquote> <p>Mehrere Zeiger hat mMn keinen Nutzen.</p> </blockquote> <p>Doch, haben sie. Das zeigt die Praxis.</p> <blockquote> <p>Als Anregung könntest Du dir mal im Reverse Engeneering anschauen, wie PHP das mit seinen "Array"-Strukturen macht. Das sind verschachtelte (sortierte) Listen von Hashes der Werte. Wo das eigentliche Datenelement dann im Speicher liegt, ist sekundär.</p> </blockquote> <p>In C ist das genau andersherum. Also in PHP und auch in Perl heißt Random Access Zugriff auf Datenstrukturen. In C jedoch heißt Random Access in erster Linie Speicheradressierung.</p> <p>Array's in C sind überhaupt kein Problem: Wenn man einen numerischen Index nutzen kann. Was C jedoch nicht kennt sind assoziative Datenstrukturen (Hashes). Natürlich kann man sich auch in C einen Hash bauen wenn man für seine Schlüssel einen Hashalgorithmus hat. Das kostet aber auch CPU und damit Zeit, einen solchen Algorithmus zu implementieren, lohnt sich also auch nur unter bestimmten Umständen, z.B. dann wenn Daten persistent im Hauptspeicher liegen (was in meiner Anwendung nicht der Fall ist).</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742449#m1742449 TS ts-self@online.de https://bitworks.de 2019-02-11T08:29:56Z 2019-02-11T08:29:56Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <blockquote> <p>Mehrere Zeiger hat mMn keinen Nutzen. Die Gesamtzahl der benötigten Taktzyklen wird durch Nebenläufigkeit nicht geringer, eher höher, […]</p> </blockquote> <p>Die Gesamtzahl der notwendigen Zyklen ist für die Performance der Software aber ggfls überhaupt nicht relevant.</p> </blockquote> <p>Das wäre dann aber nobelpreisverdächtig :-p</p> <blockquote> <blockquote> <p>da die Mutual Exclusion (Supervisor) auch kostet.</p> </blockquote> <p>Mutual exclusion wird idR erstens nicht durch supervising sichergestellt, sondern durch Locks (z.B. in Form von Mutexes) und zweitens ist das je nach Anwendungsfall auch gar nicht nötig. Read-only access darf durchaus konkurrierend stattfinden.</p> </blockquote> <p>Ich hatte jetzt angenommen, dass die gesuchten Werte ggf. auch verändert werden sollen.</p> <blockquote> <p>Ob das hier der Fall ist und ob hier Threading überhaupt Sinn macht, weiß ich nicht. Deshalb habe ich das auch nicht kommentiert. Wir wissen nur, dass Rolf mehrere Werte sucht. Da <em>kann</em> Nebenläufigkeit Sinn machen.</p> </blockquote> <p>Nur wie will man ohne Multithreading sonst eine beschleunigende Nebenläufigkeit initiieren? Einfaches Multitasking wird doch eher bremsen?!</p> <blockquote> <blockquote> <p>Als Anregung könntest Du dir mal im Reverse Engeneering anschauen, wie PHP das mit seinen "Array"-Strukturen macht. Das sind verschachtelte (sortierte) Listen von Hashes der Werte.</p> </blockquote> <p>Nein, das sind Hash-Tabellen. Der Hash-Wert des Keys ergibt die Zelle (das Bucket) des Wertes in der Tabelle. Deine Listen kommen bei PHP erst zum Einsatz, wenn es doppelte Hash-Werte für unterschiedliche Keys gibt - Kollisionen.</p> </blockquote> <p>Danke für die Richtigstellung. Mir ging es um die Hashes und damit um eine vorhandene Sortierung.</p> <blockquote> <p>Die Unterscheidung ist insofern wichtig, als dass für Hash-Tables der Aufwand für den Zugriff O(1) ist; bei Listen ist er O(n).</p> </blockquote> <p>Wenn man den Aufbau der Hashtabellen mit in die Betrachtung einbezieht, dann wird sich dies aber nur bei mehrfacher Suche wirklich lohnen, von zufällig vorsortierten Daten mal abgesehen.</p> <p>Es wird uns bisher außerdem vorenthalten, aus welcher Datenquelle die Kette wann aufgebaut wird. Wenn sie nur der einmaligen Suche dienen soll, kann man sie sich auch schenken.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742433#m1742433 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-02-11T07:10:20Z 2019-02-11T07:10:20Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <blockquote> <ol start="4"> <li>Könntest Du die Liste als (balncierten) Baum aufbauen?</li> </ol> </blockquote> <p>Ja, sowas lernt man in der Schule.</p> </blockquote> <p>Aha. Hast du Belege für diese Aussage? Vor allem in dieser Allgemeinheit (man = fast alle, aber mindestens doch ziemlich viele).</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Pantoffeltierchen haben keine Hobbys. </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742444#m1742444 TS ts-self@online.de https://bitworks.de 2019-02-11T08:06:43Z 2019-02-11T08:07:55Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <p>Hello,</p> <blockquote> <p>ich hätte dazu mehrere Fragen:</p> <ol> <li>Wie lange soll die Liste bestehen? Wird sie während ihrer Lebensdauer mehrfach durchsucht?</li> <li>Ist die Liste sortiert, bzw. indiziert?</li> <li>Um welche Datentypen handelt es sich? Sind diese ggf. sogar ordinal?</li> <li>Könntest Du die Liste als (balancierten) Baum aufbauen?</li> </ol> </blockquote> <p>Ja, sowas lernt man in der Schule.</p> </blockquote> <p>Warum nutzt Du das Schulwissen dann nicht?</p> <blockquote> <blockquote> <p>Mehrere Zeiger hat mMn keinen Nutzen.</p> </blockquote> <p>Doch, haben sie. Das zeigt die Praxis.</p> </blockquote> <p>Das kannst Du zwar behaupten, aber solange Du nicht alle Randbedingungen nennst, ist diese Behauptung unseriös. In einem single-threaded System bringen mehrere Zeiger (in je einer eigenen Funktion) für eine Einzelwertsuche keinen Vorteil, weil ihre Funktionsblöcke hübsch serialisiert abgearbeitet werden. Alles andere ist Statistik und hängt stark von der Reihenfolge (Sortierung) der Werte in der Kette ab. Eine belastbare Aussage ist also erst nach vielen Versuchen mit jeweils neu umsortierter Kette möglich.</p> <p>Und selbst wenn Du die PIQ moderner von Neumann-Syteme berücksichtigst, in der ja eine Tranformation nach Hewlett-Packard-Architektur durchgeführt wird, stehen die prefetched Commands und die Daten wieder brav hintereinander in ihren L1-Caches. Da wird - gottbewahre - nichts umsortiert.</p> <blockquote> <blockquote> <p>Als Anregung könntest Du dir mal im Reverse Engeneering anschauen, wie PHP das mit seinen "Array"-Strukturen macht. Das sind verschachtelte (sortierte) Listen von Hashes der Werte. Wo das eigentliche Datenelement dann im Speicher liegt, ist sekundär.</p> </blockquote> <p>In C ist das genau andersherum. Also in PHP und auch in Perl heißt Random Access Zugriff auf Datenstrukturen. In C jedoch heißt Random Access in erster Linie Speicheradressierung.</p> </blockquote> <p>Nach wievielen indirekten Zugriffen der eine direkte auf die Daten erfolgt, ist sicherlich wichtig. Aber auf den Speicher wird dabei immer zugegriffen. Da kann sich die PIQ aber durchaus auswirken.</p> <blockquote> <p>Array's in C sind überhaupt kein Problem: Wenn man einen numerischen Index nutzen kann. Was C jedoch nicht kennt sind assoziative Datenstrukturen (Hashes).</p> </blockquote> <blockquote> <p>Natürlich kann man sich auch in C einen Hash bauen wenn man für seine Schlüssel einen Hashalgorithmus hat. Das kostet aber auch CPU und damit Zeit, einen solchen Algorithmus zu implementieren, lohnt sich also auch nur unter bestimmten Umständen, z.B. dann wenn Daten persistent im Hauptspeicher liegen (was in meiner Anwendung nicht der Fall ist).</p> </blockquote> <p>Da überschaust Du nun deine eigene Aufgabenstellung nicht vollständig.</p> <p>Deshalb beantworte doch bitte erst einmal meine Fragen.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742447#m1742447 TS ts-self@online.de https://bitworks.de 2019-02-11T08:13:29Z 2019-02-11T08:14:18Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <blockquote> <blockquote> <ol start="4"> <li>Könntest Du die Liste als (balncierten) Baum aufbauen?</li> </ol> </blockquote> <p>Ja, sowas lernt man in der Schule.</p> </blockquote> <p>Aha. Hast du Belege für diese Aussage? Vor allem in dieser Allgemeinheit (man = fast alle, aber mindestens doch ziemlich viele).</p> </blockquote> <p>Mich stört eher, dass er dieses Schulwissen dann nicht anwendet. Und dass er meine Fragen nicht beantwortet oder sonst irgendwie alle Fakten auf den Tisch legt, ärgert mich. Wahrscheinlich werde ich seine Threads dann in Zukunft eher überlesen.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742451#m1742451 pl http://rolfrost.de/ddrende.html 2019-02-11T08:54:40Z 2019-02-11T08:54:40Z Zeiger Wettrennen <blockquote> <p>Da überschaust Du nun deine eigene Aufgabenstellung nicht vollständig.</p> </blockquote> <p>Tut mir leid, da versperren mir Deine vielen Buzzworte die Sicht.</p> <p>Auf jeden Fall ist Optimierung eine praktische Angelegenheit. Und ja, die Liste ist sortiert, die wird schon sortiert bereitgestellt. Genau da fängt nämlich die Optimierung auch schon an: Bei der Bereitstellung der Daten (Deployment).</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742462#m1742462 pl http://rolfrost.de/ddrende.html 2019-02-11T09:39:45Z 2019-02-11T09:39:45Z Zeiger Wettrennen <blockquote> <p>In einem single-threaded System bringen mehrere Zeiger (in je einer eigenen Funktion) für eine Einzelwertsuche keinen Vorteil, weil ihre Funktionsblöcke hübsch serialisiert abgearbeitet werden.</p> </blockquote> <p>Eben. Genau deswegen brauchst Du schonmal 2 Zeiger wenn Du 2 Schleifen ineinandergeschachtelt über einunddieselbe Liste legst.</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742476#m1742476 Rolf B 2019-02-11T12:51:52Z 2019-02-11T12:51:52Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <p>Und selbst wenn Du die PIQ moderner von Neumann-Syteme berücksichtigst, in der ja eine Transformation nach Hewlett-Packard-Architektur durchgeführt wird, stehen die prefetched Commands und die Daten wieder brav hintereinander in ihren L1-Caches. Da wird - gottbewahre - nichts umsortiert.</p> </blockquote> <p>Allerdings, ordentlich Buzzwords </p> <p>Aber meinst Du HP Architektur, im Sinne von <a href="https://en.wikipedia.org/wiki/PA-RISC" rel="nofollow noopener noreferrer">PA-RISC</a>? Das machen viele Prozessoren, wenn sie die regulären Instruktionen in Mikro-Ops (uops) übersetzen. Oder meinst Du vielleicht Harvard-Architektur, im Sinne von Trennung von Befehls- und Datenspeicher, weil der L1-Cache ist für Befehle und Daten getrennt ist? Für die Mikro-Ops haben neuerer Prozessoren nochmal einen eigenen Cache (Intel Core: Ab Sandy Bridge, 2011).</p> <p>Eine Umsortierung der Commands ist übrigens auch nicht ausgeschlossen, solange der Prozessor genug Schattenregister übrig hat. Nennt sich out-of-order execution...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742452#m1742452 pl http://rolfrost.de/ddrende.html 2019-02-11T08:57:24Z 2019-02-11T08:57:24Z Zeiger Wettrennen <p>Du verstehst die Redewendung nicht! Was aber auch typisch für Theoretiker ist MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742450#m1742450 Christian Kruse https://wwwtech.de/about 2019-02-11T08:37:39Z 2019-02-11T08:37:39Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <blockquote> <blockquote> <p>Mehrere Zeiger hat mMn keinen Nutzen. Die Gesamtzahl der benötigten Taktzyklen wird durch Nebenläufigkeit nicht geringer, eher höher, […]</p> </blockquote> <p>Die Gesamtzahl der notwendigen Zyklen ist für die Performance der Software aber ggfls überhaupt nicht relevant.</p> </blockquote> <p>Das wäre dann aber nobelpreisverdächtig :-p</p> </blockquote> <p>Nein. Das ist eine Entwicklung der letzten 10 Jahre. Concurrency kann sich eher lohnen als Micro-Optimierung des Algorithmus.</p> <p>Beachte, dass ich <em>kann</em> schrieb.</p> <blockquote> <p>Ich hatte jetzt angenommen, dass die gesuchten Werte ggf. auch verändert werden sollen.</p> </blockquote> <p>Ja, und ich hatte extra gar nichts angenommen. Wir sprechen hier ja über Hotti – da weiß man nie! </p> <blockquote> <blockquote> <p>Ob das hier der Fall ist und ob hier Threading überhaupt Sinn macht, weiß ich nicht. Deshalb habe ich das auch nicht kommentiert. Wir wissen nur, dass Rolf mehrere Werte sucht. Da <em>kann</em> Nebenläufigkeit Sinn machen.</p> </blockquote> <p>Nur wie will man ohne Multithreading sonst eine beschleunigende Nebenläufigkeit initiieren? Einfaches Multitasking wird doch eher bremsen?!</p> </blockquote> <p>Ich glaube, du hast irgendwas nicht so richtig verstanden. Ich schrieb nicht, dass er auf Threading verzichten soll und Multitasking über Prozess-Grenzen hinweg nutzen soll. Ich schrieb, dass man unter den vorliegenden Informationen einfach nicht sagen kann, ob Nebenläufigkeit Sinn macht oder ob es nicht sinnvoller ist, einfach nur ganz traditionell ein single-threaded Programm zu schreiben, ohne jegliche Form von Nebenläufigkeit (außer der, die man ggfls durch CPU-Optimierung geschenkt bekommt).</p> <blockquote> <blockquote> <p>Die Unterscheidung ist insofern wichtig, als dass für Hash-Tables der Aufwand für den Zugriff O(1) ist; bei Listen ist er O(n).</p> </blockquote> <p>Wenn man den Aufbau der Hashtabellen mit in die Betrachtung einbezieht, dann wird sich dies aber nur bei mehrfacher Suche wirklich lohnen, von zufällig vorsortierten Daten mal abgesehen.</p> <p>Es wird uns bisher außerdem vorenthalten, aus welcher Datenquelle die Kette wann aufgebaut wird. Wenn sie nur der einmaligen Suche dienen soll, kann man sie sich auch schenken.</p> </blockquote> <p>Natürlich. Ich schrieb ja mit voller Absicht keine Empfehlung, sondern nur eine Richtigstellung. Ich werde mich hüten, bei der dürftigen Informationslage eine Empfehlung auszusprechen.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742458#m1742458 pl http://rolfrost.de/ddrende.html 2019-02-11T09:28:05Z 2019-02-11T09:28:05Z Zeiger Wettrennen <blockquote> <p>Es wird uns bisher außerdem vorenthalten, aus welcher Datenquelle die Kette wann aufgebaut wird.</p> </blockquote> <p>Nun, ich schrieb von einer Liste mit einigen 1000 Einträgen. Da dürfte eigentlich klar sein, daß als Quelle nur eine Datei in Frage kommt </p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742466#m1742466 TS ts-self@online.de https://bitworks.de 2019-02-11T10:34:51Z 2019-02-11T10:34:51Z Zeiger Wettrennen <p>Hello,</p> <p>[•••]</p> <p>Na dann :-)<br> Weiterhin "fröhliches Rätselraten mit Hotti".</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742467#m1742467 TS ts-self@online.de https://bitworks.de 2019-02-11T10:43:07Z 2019-02-11T10:43:07Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <blockquote> <p>Da überschaust Du nun deine eigene Aufgabenstellung nicht vollständig.</p> </blockquote> <p>Tut mir leid, da versperren mir Deine vielen Buzzworte die Sicht.</p> </blockquote> <p>?</p> <blockquote> <p>Auf jeden Fall ist Optimierung eine praktische Angelegenheit. Und ja, die Liste ist sortiert, die wird schon sortiert bereitgestellt. Genau da fängt nämlich die Optimierung auch schon an: Bei der Bereitstellung der Daten (Deployment).</p> </blockquote> <p>Na dann lad die Datei doch in ein klassisches Array (feste Elementgröße) und mach eine Binärsuche. Schneller wird es kaum gehen.</p> <p>Aber eigentlich kannst Du dann auch schon beim Einlesen der Datei den Wertevergleich durchführen. Dann benötigst Du keine verkettete Liste mehr. Die ist auch nur dann zweckmäßig, wenn die Elemente unterschiedliche Größe und/oder Struktur haben. Aber Du lässt ja keine Information rüberwachsen.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742469#m1742469 TS ts-self@online.de https://bitworks.de 2019-02-11T10:46:07Z 2019-02-11T10:46:07Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <blockquote> <p>In einem single-threaded System bringen mehrere Zeiger (in je einer eigenen Funktion) für eine Einzelwertsuche keinen Vorteil, weil ihre Funktionsblöcke hübsch serialisiert abgearbeitet werden.</p> </blockquote> <p>Eben. Genau deswegen brauchst Du schonmal 2 Zeiger wenn Du 2 Schleifen ineinandergeschachtelt über einunddieselbe Liste legst.</p> </blockquote> <p>Ich verstehe Dich immer weniger. Bitte ändere doch nicht dauernd während des Spiels die Spielregeln.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742477#m1742477 Rolf B 2019-02-11T12:59:52Z 2019-02-11T12:59:52Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <p>Na dann lad die Datei doch in ein klassisches Array (feste Elementgröße) und mach eine Binärsuche. Schneller wird es kaum gehen.</p> </blockquote> <p>Klar geht's schneller. Wenn die zu durchsuchenden Daten vorverarbeitet in einer Datei liegen, schreibt man die Datei nicht sequenziell sondern als B-Tree. Man muss nur abwägen. Wenn es ein paar 1000 Einträge sind und jeder Eintrag 1K groß ist, kann sich das lohnen. Ist jeder Eintrag nur 50 Bytes oder so, könnte das sequenzielle Einlesen der Datei schneller sein.</p> <p>Die Organisation als B-Tree bringt trotzdem noch einen Tempovorteil. Der Treffer ist dann in 0.1ms statt 1ms ermittelt. Was beim Handling von 3 Web Requests pro Sekunde komplett wurscht ist. Bei 10000 Requests pro Sekunde sieht sie Sache natürlich anders aus.</p> <p>Programmiererweisheit: Optimiere an Details nur, wo es nötig ist. Wenn du Geld sparen willst, investiere in Hardware statt in Programmiererstunden. Bei massiven Performanceproblemen überdenke deine Architektur. Ist die Performance ausreichend, mach lieber Urlaub statt Mikrosekunden zu knibbeln.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742498#m1742498 TS ts-self@online.de https://bitworks.de 2019-02-11T17:05:40Z 2019-02-11T17:05:40Z Zeiger Wettrennen <p>Hello,</p> <p>ich meinte selbstverständlich die Harvard-Architektur. Da hatte sich bei meinem Synapsennetz wohl ein Fehler eingeschlichen.</p> <p>Es ging ja um die Trennung von Befehlen und Daten beim Prefetch.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742478#m1742478 Christian Kruse https://wwwtech.de/about 2019-02-11T13:02:48Z 2019-02-11T13:02:48Z Zeiger Wettrennen <p>Hallo Rolf,</p> <blockquote> <p>Klar geht's schneller. Wenn die zu durchsuchenden Daten vorverarbeitet in einer Datei liegen, schreibt man die Datei nicht sequenziell sondern als B-Tree.</p> </blockquote> <p>Naja, ein sortierter Array ist ja ein Binärbaum. Aber ja, richtig, das muss man nicht einlesen, gerade in Zeiten von SSDs kann sich der Random-Access ziemlich lohnen.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742484#m1742484 pl http://rolfrost.de/ddrende.html 2019-02-11T14:47:37Z 2019-02-11T14:47:37Z Zeiger Wettrennen <p>hi,</p> <blockquote> <p>Klar geht's schneller. Wenn die zu durchsuchenden Daten vorverarbeitet in einer Datei liegen, schreibt man die Datei nicht sequenziell sondern als B-Tree.</p> </blockquote> <p>Dateien werden immer sequentiell geschrieben. Was meine Daten betrifft: Das sind Schlüssel-Werte-Paare wobei auf einen Schlüssel mehrere Attribute fallen mit den dazugehörigen Werten.</p> <p>In meiner Datei liegen diese Tupel nach Schlüssel sortiert vor, haben jedoch keine feste Länge. Da man beim Lesen die Länge aber wissen muss, ist die natürlich vor jedem Tupel als Offset angegeben.</p> <p>Diese Daten als B-Tree abzulegen macht keinen Sinn, weil sich die daraus zu erzeugenden Hierarchien erst aus dem Inhalt ergeben und sehr vielgestaltig sein können.</p> <p>Dennoch gibt es Möglichkeiten zur Optimierung die sich z.B. die Sortierung zunutze machen. So kann man z.b. die Speicheradresse ermitteln an welcher ein Schlüssel (Entity) das erstemal auftritt, muss also nicht jedesmal von vorn beginnen. Und da C die Daten unfragmentiert im Hauptspeicher hält, ergeben sich solche Zeiger ja aus dem Offset der ohnehin in der Datei selbst kodiert ist.</p> <p>Das nutze ich bereits, aber merklich bringt's bei meinen Datenmengen nichts. Denn die Performance ist auch ohne Optimierung schon so überwältigend, daß ich über Optimierungen nur nachdenke wenn's mir langweilig wird </p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742497#m1742497 TS ts-self@online.de https://bitworks.de 2019-02-11T16:59:31Z 2019-02-11T16:59:31Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <blockquote> <p>Klar geht's schneller. Wenn die zu durchsuchenden Daten vorverarbeitet in einer Datei liegen, schreibt man die Datei nicht sequenziell sondern als B-Tree.</p> </blockquote> <p>Naja, ein sortierter Array ist ja ein Binärbaum. Aber ja, richtig, das muss man nicht einlesen, gerade in Zeiten von SSDs kann sich der Random-Access ziemlich lohnen.</p> </blockquote> <p>Klar, bei 1000 Elementen und einer sortierten Datei Datei mit festem Satzaufbau auf einem SSD-Datenträger wird sich das umkopieren ins RAM vermutlich gar nicht lohnen.</p> <p>Da stehen maximal 9 Direktzugriffe auf die SSD dem kopieren von ganz vielen Bytes entgegen und dann hätte man die Suczugriffe ja trotzdem noch durchzuführen.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742485#m1742485 Christian Kruse https://wwwtech.de/about 2019-02-11T14:57:38Z 2019-02-11T14:57:38Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <p>Dateien werden immer sequentiell geschrieben.</p> </blockquote> <p>Nein.</p> <pre><code class="block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span> <span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> FILE <span class="token operator">*</span>fd <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string">"test.txt"</span><span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fseek</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token number">4</span> <span class="token operator">*</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">SEEK_SET</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token string">"bar\n"</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> fd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fflush</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fseek</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token constant">SEEK_SET</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token string">"foo"</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> fd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fclose</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="block">➜ ckruse@Pug ~ % gcc -Wall -ansi -pedantic -o test test.c ➜ ckruse@Pug ~ % ./test ➜ ckruse@Pug ~ % cat test.txt foobar ➜ ckruse@Pug ~ % </code></pre> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742490#m1742490 Rolf B 2019-02-11T15:51:45Z 2019-02-11T15:51:45Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <p>In meiner Datei liegen diese Tupel nach Schlüssel sortiert vor (...)</p> </blockquote> <blockquote> <p>Diese Daten als B-Tree abzulegen macht keinen Sinn (...)</p> </blockquote> <p>Du siehst den Widerspruch? Eine nach Schlüssel sortierte Menge lässt sich IMMER als Baum organisieren. Auch als B-Tree. Ein B-Tree wird in Seiten aufgeteilt; eine Seite enthält 1-N Einträge. Es gibt 3 Varianten:</p> <ol> <li>Schlüssel und Daten haben feste Länge: Prima. Organisiere die Einträge der Seite als Array und suche binär darin</li> <li>Schlüssel haben feste Länge, Daten nicht. Ok. Organisiere die Schlüssel als Array und füge jedem Schlüssel einen Offset auf seine Daten hinzu. Diese lege hinter dem Schlüsselarray ab. Da eine Page typischerweise kleiner als 64K ist, reicht für den Offset ein short-Wert.</li> <li>Schlüssel und Daten haben variable Länge. Der blödeste Fall. Die Seiten müssen sequenziell durchsucht werden. Wenn die Schlüssellänge nicht zu breit variiert, könnte man die Schlüssel auf gleiche Länge auffüllen und auf Fall 2 zurückfallen.</li> </ol> <p>Es ist aber nicht unbedingt einfach , einen B-Tree selbst zu programmieren. Wenn es ein readonly-Tree ist, wie vermutlich hier, geht's noch.</p> <blockquote> <p>Denn die Performance ist auch ohne Optimierung schon so überwältigend, daß ich über Optimierungen nur nachdenke wenn's mir langweilig wird</p> </blockquote> <p>Ach so. Dann können wir das hier ja zumachen.</p> <p>Fazit jedenfalls: Ein Zeigerwettrennen bringt nur was wenn sie auf verschiedenen Kernen gleichzeitig rennen. Eine single-thread Optimierung setzt voraus, dass Du deine Datenstruktur für die gewünschte Abfrage optimierst. Angesichts des geringen Datenumfangs und der bereits angeführten Geschwindigkeit des Ist-Zustandes wird sich der Effekt für den Webseitennutzer nur bemerkbar machen, wenn Du deine Social Media Plattform "Ronald's Lounge"<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> darauf betreiben willst.</p> <p>Eine Alternative zu einem auf Disk gespeicherten B-Tree wäre übrigens, von CGI auf FastCGI zu wechseln. Dann kannst Du die Daten sortiert im RAM behalten und jede Suche binär durchführen. Das ist auch eine schöne Aufgabe für langweilige Abende </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p><a href="https://en.wikipedia.org/wiki/Discworld_characters#Ronald_Rust" rel="nofollow noopener noreferrer">Ronald?</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742488#m1742488 pl http://rolfrost.de/ddrende.html 2019-02-11T15:33:47Z 2019-02-11T15:33:47Z Zeiger Wettrennen <p>hi,</p> <blockquote> <blockquote> <p>Dateien werden immer sequentiell geschrieben.</p> </blockquote> <p>Nein.</p> </blockquote> <p>Ok, kann man machen. Fragt sich nur für was das gut sein soll. Mit Perl hab ich sowas auch schon gemacht um einen bestimmten Bereich, nämlich den zwischen SEEK_SET und SEEK_END mit Nullbytes vorzubelegen. Ob C dasselbe macht hab ich noch nicht getestet.</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742489#m1742489 Christian Kruse https://wwwtech.de/about 2019-02-11T15:43:12Z 2019-02-11T15:43:12Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <p>Ok, kann man machen. Fragt sich nur für was das gut sein soll.</p> </blockquote> <p>Das war ein Beispiel. Die Verwendung von <code>fseek()</code> findet z.B. dann Anwendung, wenn man nur Teile der Datei ändern oder auslesen will. Z.B. um einen Index zu durchsuchen oder um ein Datum in einer Datenbank-Datei zu ändern.</p> <blockquote> <p>Mit Perl hab ich sowas auch schon gemacht um einen bestimmten Bereich, nämlich den zwischen SEEK_SET und SEEK_END mit Nullbytes vorzubelegen. Ob C dasselbe macht hab ich noch nicht getestet.</p> </blockquote> <p>Das ist keine Eigenheit von Perl, sondern von dem System-Call. Mit anderen Worten: <code>fseek()</code> verhält sich da gleich, weil es den gleichen System-Call verwendet. Unter Linux ist das <code>lseek</code>.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742491#m1742491 pl http://rolfrost.de/ddrende.html 2019-02-11T15:55:33Z 2019-02-11T15:55:33Z Zeiger Wettrennen <p>hi,</p> <blockquote> <p>Das war ein Beispiel. Die Verwendung von <code>fseek()</code> findet z.B. dann Anwendung, wenn man nur Teile der Datei ändern oder auslesen will. Z.B. um einen Index zu durchsuchen oder um ein Datum in einer Datenbank-Datei zu ändern.</p> </blockquote> <p>Das ist das was man eigentlich nicht machen sollte: Strukturen auf Dateiebene ändern. Und auch eine Suche ist effizienter wenn sie nicht auf Dateiebene sondern im Hauptspeicher ausgeführt wird. Kurzum: Random Access auf Dateiebene (dem Transport Layer!) abbilden zu wollen ist nicht nur Unfug sondern völlig ineffizient.</p> <blockquote> <p>Das ist keine Eigenheit von Perl, sondern von dem System-Call. Mit anderen Worten: <code>fseek()</code> verhält sich da gleich, weil es den gleichen System-Call verwendet. Unter Linux ist das <code>lseek</code>.</p> </blockquote> <p>Ja, man lann auf diese Art und Weise einen ganzen Datenträger so löschen, daß etwaige vorher geschriebene Daten nicht wieder hergestellt werden könne. Ist aber letztendlich auch ein sequentieller Vorgang.</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742493#m1742493 pl http://rolfrost.de/ddrende.html 2019-02-11T16:18:59Z 2019-02-11T16:18:59Z Zeiger Wettrennen <p>Logisch, Haiberformens ist nix für native CGI. FastCGI oder modPerl sind die Alternativen, da wird ein Großteil der Daten beim Serverstart in den RAM gelesen und da bleibt das auch solange der Server läuft.</p> <p>Mein FW in C auf meiner lokalen Kiste in native CGI ist von der Performance jedoch schon einem mod_perl oder FastCGI auf derselben Maschine deutlich überlegen. Es ist also nur eine weitere Alternative, meiner Idee folgend, ein Framework in verschiedenen Programmiersprachen umzusetzen und zwar so, daß dies dem Anwender transparent ist:</p> <p>Ein Anwender klickt sich durch und merkt gar nicht, ob die jeweilige Seite in Perl, PHP oder C ausgeliefert wird.</p> <p>Was sich daraus für Möglichkeiten ergeben kann man nur erahnen insbesondere human ressources: Wie, Sie können kein Perl, auch gut dann machens eben in C oder in PHP oder in Java, Python oder .. Und natürlich gibt es PLs mit denen man bestimmte Dinge eben effiziente lösen kann als mit anderen PLs.</p> <p>Es kommt immer darauf an die Idee zu verstehen. MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742503#m1742503 Christian Kruse https://wwwtech.de/about 2019-02-11T18:27:11Z 2019-02-11T18:27:11Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <blockquote> <p>Das war ein Beispiel. Die Verwendung von <code>fseek()</code> findet z.B. dann Anwendung, wenn man nur Teile der Datei ändern oder auslesen will. Z.B. um einen Index zu durchsuchen oder um ein Datum in einer Datenbank-Datei zu ändern.</p> </blockquote> <p>Das ist das was man eigentlich nicht machen sollte: Strukturen auf Dateiebene ändern. Und auch eine Suche ist effizienter wenn sie nicht auf Dateiebene sondern im Hauptspeicher ausgeführt wird. Kurzum: Random Access auf Dateiebene (dem Transport Layer!) abbilden zu wollen ist nicht nur Unfug sondern völlig ineffizient.</p> </blockquote> <p>Aha. Du willst mir gerade weis machen, dass eine Datenbank erstmal 12 Gigabyte Daten auslesen soll um dann eine Reihe zu ändern und danach wieder 12 Gigabyte Daten zurückschreiben soll?</p> <p>Du redest manchmal so einen unglaublichen Stuss. </p> <blockquote> <blockquote> <p>Das ist keine Eigenheit von Perl, sondern von dem System-Call. Mit anderen Worten: <code>fseek()</code> verhält sich da gleich, weil es den gleichen System-Call verwendet. Unter Linux ist das <code>lseek</code>.</p> </blockquote> <p>Ja, man lann auf diese Art und Weise einen ganzen Datenträger so löschen, daß etwaige vorher geschriebene Daten nicht wieder hergestellt werden könne.</p> </blockquote> <p>Nein, das stimmt auch nicht.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742504#m1742504 Christian Kruse https://wwwtech.de/about 2019-02-11T18:28:59Z 2019-02-11T18:28:59Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <p>Klar, bei 1000 Elementen und einer sortierten Datei Datei mit festem Satzaufbau auf einem SSD-Datenträger wird sich das umkopieren ins RAM vermutlich gar nicht lohnen.</p> </blockquote> <p>Gerade bei so kleinen Zahlen würde ich davon ausgehen, dass <code>seek()</code>en <em>viel</em> teurer ist. Das sind im worst case 9+9 system calls (<code>lseek</code> und <code>read</code>) vs. ein system call (<code>read</code>).</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742516#m1742516 pl http://rolfrost.de/ddrende.html 2019-02-12T07:41:00Z 2019-02-12T07:41:00Z Zeiger Wettrennen <p>Tom es reicht.</p> <p>Es sei denn Du zeigst hier mal ein bischen Code damit man mal verstehen kann wovon Du die ganze Zeit erzählst. Was eine verkettee Liste ist in C weißt Du?</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742514#m1742514 TS ts-self@online.de https://bitworks.de 2019-02-12T07:10:55Z 2019-02-12T07:10:55Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <blockquote> <p>Klar, bei 1000 Elementen und einer sortierten Datei Datei mit festem Satzaufbau auf einem SSD-Datenträger wird sich das umkopieren ins RAM vermutlich gar nicht lohnen.</p> </blockquote> <p>Gerade bei so kleinen Zahlen würde ich davon ausgehen, dass <code>seek()</code>en <em>viel</em> teurer ist. Das sind im worst case 9+9 system calls (<code>lseek</code> und <code>read</code>) vs. ein system call (<code>read</code>).</p> </blockquote> <p>Stimmt auch wieder.</p> <p>Aber da wird es auch schon philosophisch. Wenn die Datei klein genug ist, wird der Cache des Filesystems auch mitreden wollen und die Sache beschleunigen ;-)</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742517#m1742517 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-02-12T08:52:02Z 2019-02-12T08:52:02Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <p>Aber da wird es auch schon philosophisch.</p> </blockquote> <p>Eine Flasche Rotwein kann acht Semester Philosophiestudium ersetzen.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Pantoffeltierchen haben keine Hobbys. </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742518#m1742518 Christian Kruse https://wwwtech.de/about 2019-02-12T09:09:50Z 2019-02-12T09:09:50Z Zeiger Wettrennen <p>Hallo TS,</p> <blockquote> <p>Aber da wird es auch schon philosophisch. Wenn die Datei klein genug ist, wird der Cache des Filesystems auch mitreden wollen und die Sache beschleunigen ;-)</p> </blockquote> <p>Darauf bauen Datenbank-Systeme sogar. PostgreSQL hat sogar einen Konfigurationsparameter, mit dem man definieren kann, wie groß vermutlich der FS-Cache sein wird (Spoiler: bei einem dedizierten DB-Server ist „etwa 50% des RAM“ ein guter Wert). Der Parameter hat Einfluss auf die cost estimates und verändert so ggfls den execution plan.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742520#m1742520 TS ts-self@online.de https://bitworks.de 2019-02-12T11:46:10Z 2019-02-12T11:50:02Z Zeiger Wettrennen <p>Hello,</p> <blockquote> <p>Tom es reicht.</p> </blockquote> <p>Oh, entschuldige bitte, wenn ich zu schnell war. Ich dachte, dass Du noch mitkommst.</p> <blockquote> <p>Es sei denn Du zeigst hier mal ein bischen Code damit man mal verstehen kann wovon Du die ganze Zeit erzählst. Was eine verkettee Liste ist in C weißt Du?</p> </blockquote> <p>Ja. Wir reden doch die ganze Zeit darüber, oder?</p> <p>Übrigens vermute ich mal, dass die in allen Compilersprachen für 8086-ff-Architektur genauso aussieht, auch wenn die Begriffe in den Sprachen unterschiedlich sind.</p> <p>Ich mag besonders die <a href="http://www.netzmafia.de/skripten/programmieren/liste-d.gif" rel="nofollow noopener noreferrer">bidirektional verketteten</a>. Im Bild fehlen noch die beiden Anker für Start und Ende, damit man auch mit der Struktur arbeiten kann.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742521#m1742521 pl http://rolfrost.de/ddrende.html 2019-02-12T12:31:49Z 2019-02-12T12:31:49Z Zeiger Wettrennen <p>Hi Tom,</p> <p>Dein theoretisches Wissen in Ehren aber das bringt mich nicht weiter.</p> <blockquote> <p>Ich mag besonders die bidirektional verketteten. Im Bild fehlen noch die beiden Anker für Start und Ende, damit man auch mit der Struktur arbeiten kann.</p> </blockquote> <p>Dein Vorlieben auch nicht. MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742522#m1742522 Rolf B 2019-02-12T13:41:46Z 2019-02-12T13:41:46Z Zeiger Wettrennen <p>Hallo pl,</p> <p>wir reden aktuell über Konzepte, da helfen Codebeispiele nicht so recht.</p> <p>Du fragtest, ob ein Konstrukt sinnvoll ist, in dem eine lineare Liste mit mehreren Zeigern abgegrast wird, die unterschiedliche Teile der Liste bearbeiten. Antwort war: Ja, wenn es multithreaded ist. Sonst nicht. Damit wäre das Thema eigentlich erledigt.</p> <p>Wenn der Code single-threaded ist, so die weitergehende Überlegung, könnte eine Aufteilung der Suche über mehrere Intervalle ggf. sogar kontraproduktiv sein, aus Überlegungen heraus, die auf die Prozessorarchitektur zurückgehen. Da sind wir aber im Bereich des Taktezählens, und das tut man erst wenn die letzten logischen Optimierungen ausgereizt sind. Ein Abgleiten deinerseits, mit mehreren Zeigern eine Schachtelung abzubilden, haben wir beiseitegelegt. Weil das nicht die Frage war.</p> <p>Mehr oder weniger optimale Implementierungen linearer Listen bringen nur marginalen Nutzen. Ob nun einfach oder doppelt verkettet. Ob Du eine doppelt verkettete Liste brauchst oder nicht hängt von den Operationen ab die Du ausführen willst, aber für eine lineare Suche ist das unerheblich. Da sind die Algorithmen auf einfach und doppelt verketteten Listen gleich.</p> <p>Und ich bin sicher, dass Du für Listen keine Codebeispiele brauchst, die findest Du reichlich bei deinem verehrten Niklaus Wirth.</p> <p>Fazit bleibt immer noch: Eine echte Beschleunigung erhältst Du nur wenn Du die Liste durch was anderes ersetzt, so dass du eine rein sequenzielle Suche vermeiden kannst. Sprich: Brain statt Blech. Aber da hast Du abgewunken, weil dein Code eh schon so schnell ist.</p> <p>Ob dieser Ersatz möglich ist, hängt von der Anwendung ab. Sind deine Suchabfragen so geartet, dass Du an Hand der Suchparameter das zu durchsuchende Intervall eingrenzen kannst? Das wäre bspw. der Fall wenn Du Einträge suchst die ein bestimmtes Präfix haben (Suche alle Schlüssel, die die mit "self" beginnen). Eine Suche nach allen Worten, die "self" enthalten, würdest Du damit nicht optimieren können, dafür bleibt nur die erschöpfende Suche. Suchst Du alle Einträge, deren Schlüssel nach dem letzten / mit self beginnt (also z.B. self*.html in allen Ordnern), würde Dir ein Suchindex helfen wo der Filename nach vorne gezogen ist.</p> <p>Frage ist dann immer, wie man das in einer CGI Anwendung realisiert. Da lohnt es nicht, aufwändig Suchstrukturen aufzubauen, die nur einmal verwendet werden. Deswegen kam mein Vorschlag nach einer passenden Speicherung in der Datei, in der die zu durchsuchenden Daten liegen. Sprich: Du baust die Suchstruktur außerhalb des CGI-Programms auf und liest sie dort als Binary ein. Was dazu führt, dass Du im gespeicherten Binary keine Pointer verwenden kannst, sondern Offsets verwenden musst. Und es führt zur Überlegung, ob das segmentweise Lesen einer vergleichsweise kleinen Datei effizient ist. Das sind alles Kriterien, die je nach konkretem Fall zu unterschiedlichen Optimierungsergebnissen führen können. Den konkreten Fall kennst aber nur Du. Die Frage, ob die Mühe echten Mehrwert bringt, kannst auch nur Du beantworten.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742523#m1742523 pl http://rolfrost.de/ddrende.html 2019-02-12T14:15:34Z 2019-02-12T14:15:34Z Zeiger Wettrennen <p>Rolf die Sache ist doch die: C kennt keine assoziative Arrays. D.h., wenn ein nichtnumerischer Schlüssel vorliegt, also ein String, läuft es immer auf einen Vergleich hinaus wofür eine Liste (oder eine Sequenz) sequentiell durchlaufen werden muss.</p> <p>Das gilt auch für einen Index genauso wie für eine Hashtable.</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742524#m1742524 Christian Kruse https://wwwtech.de/about 2019-02-12T14:19:26Z 2019-02-12T14:19:26Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <p>Rolf die Sache ist doch die: C kennt keine assoziative Arrays. D.h., wenn ein nichtnumerischer Schlüssel vorliegt, also ein String, läuft es immer auf einen Vergleich hinaus wofür eine Liste (oder eine Sequenz) sequentiell durchlaufen werden muss.</p> <p>Das gilt auch für einen Index genauso wie für eine Hashtable.</p> </blockquote> <p>Rolf, nur weil du nicht weißt und dir nicht vorstellen kannst, wie man das baut, heißt das nicht, dass es nicht möglich ist. Auch in C kann man Hashtables bauen. Eine der bekannteren Implementationen ist wohl <a href="http://troydhanson.github.io/uthash/" rel="nofollow noopener noreferrer">uthash</a>.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742531#m1742531 Rolf B 2019-02-12T15:35:47Z 2019-02-12T15:35:47Z Zeiger Wettrennen <p>Hallo pl,</p> <p>man kann mit Hilfe von Indextabellen auch anders vorgehen. Ob es sinnvoll ist, hängt vom Anwendungsfall ab.</p> <p>Beispiel mit einer winzigen Liste. Denk Dir technische Details wie Längenfelder dazu.</p> <pre><code class="block">0....:....1....:....2....:....3....:....4....:....5....:....6....:....7 alma,alpha,beta,charlie,foxi,foxtrott,martin,marzipan,selfhtml,troubadix </code></pre> <p>Dazu könnte man nun eine Indexliste anlegen:</p> <pre><code class="block">alma -> 0 charlie -> 16 marzipan -> 45 </code></pre> <p>Wenn Du nun nach fox* suchst, dann suchst zu zuerst in der Indexliste und machst 3 Prüfungen, bis Du "marzipan" findest und demzufolge weißt, dass Du im Bereich 16-44 suchen musst. Nur diesen Teil musst Du jetzt noch aus der Datei laden. Weiter geht's dort, und du machst 4 Prüfungen, bis Du bei "martin" ankommst und fertig bist. 8 Prüfungen. Im kleinen Beispiel ist der Gewinn 0, aber wenn Du bspw. 5000 Einträge hast und im Index jeden 50-ten Eintrag einträgst, reduzierst Du durchschnittlich 2500 Prüfungen auf 50+25 (bzw. maximal 5000 auf 150). Du musst beim Erstellen des Index nur aufpassen, dass an den Übergängen das erste Zeichen des Schlüssels wechselt, sonst könnte foxtrott im Index stehen und foxi steht auf der Seite davor. Oder Du musst sicherheitshalber die Seite davor mit durchsuchen, das wird dann lästig.</p> <p>Das kann man auch mit mehr als 2 Stufen tun (also bei einer großen Indexliste nochmal einen Index drüberlegen), das Ergebnis ist eine <a href="https://de.wikipedia.org/wiki/Index_Sequential_Access_Method" rel="nofollow noopener noreferrer">ISAM</a> Datei.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742526#m1742526 pl http://rolfrost.de/ddrende.html 2019-02-12T14:53:46Z 2019-02-12T14:53:46Z Zeiger Wettrennen <p>Ja, uthash kenne ich. Und wie gesagt, der Nutzen eines numerischen Key ist gleich NULL. Unterdessen habe ich meinen Indexer auch schon im Hinterkopf. Natürlich ist ein Index oder eine Hashtable kleiner als die gesamte Liste. Was aber auch nichts an der Tatsache ändert, daß auch ein Index oder Hashtable sequentiell durchsucht werden muss!</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742527#m1742527 Christian Kruse https://wwwtech.de/about 2019-02-12T15:00:16Z 2019-02-12T15:00:16Z Zeiger Wettrennen <p>Hallo pl,</p> <blockquote> <p>Ja, uthash kenne ich. Und wie gesagt, der Nutzen eines numerischen Key ist gleich NULL.</p> </blockquote> <p>Das ist nicht richtig. Nummerische Keys für Hashtables können durchaus sinnvoll sein, etwa wenn man große Lücken in der Key-Verteilung hat. Z.B. liegen Werte vor für die Keys 10, 210, 1024, 768 und 5124. Dafür einen Array mit den aufgeführten Keys zu verwenden wäre, gelinde gesagt, unsinnig.</p> <blockquote> <p>Natürlich ist ein Index oder eine Hashtable kleiner als die gesamte Liste.</p> </blockquote> <p>??? Nein. Das geht ja auch gar nicht. Die Art des Zugriffs ändert sich, und damit der Aufwand einen Wert zu finden.</p> <blockquote> <p>Was aber auch nichts an der Tatsache ändert, daß auch ein Index oder Hashtable sequentiell durchsucht werden muss!</p> </blockquote> <p>Das hängt von der Art der Suche ab. Wenn ich einen Wert anhand des Keys finden will, dann ist deine Aussage falsch.</p> <p>Wenn du den Wert finden willst ohne den Key zu kennen, dann hast du recht.</p> <p>So, wie du es geschrieben hast, ist es aber mindestens ungenau.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742528#m1742528 pl http://rolfrost.de/ddrende.html 2019-02-12T15:04:15Z 2019-02-12T15:04:15Z Zeiger Wettrennen <p>PS: Den Index werd' ich mit Perl erstellen, er wird alle Schlüssel auf eine feste Länge bringen, so daß die Anzahl der Einträge in einem festen Bezug zur Dateilänge steht. Perl und C arbeiten hervorragend zusammen.</p> <p>MG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742534#m1742534 pl http://rolfrost.de/ddrende.html 2019-02-12T16:23:19Z 2019-02-12T16:23:19Z Zeiger Wettrennen <p>Hi,</p> <p>bei all der Indexerei sollte aber auch der Nachteil nicht unerwähnt bleiben: Die Datenfelder auf die ein Index zeigt, stehen sowohl namentlich als auch von der Anzahl her fest. Beispiel:</p> <p>RedirectURL sei <code>/index.html</code> wir gucken in den Index und finden eine 13. Mit dieser Nummer gehts ab ins Datenarray wo wir <code>title</code>, <code>descr</code>, <code>body</code> usw. bekommen.</p> <p>Aber egal, wenn Attribute (Datenfelder) hinzukommen muss sowieso neu kompiliert werden </p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742586#m1742586 pl http://rolfrost.de/ddrende.html 2019-02-13T09:42:39Z 2019-02-13T09:42:39Z Zeiger Wettrennen <p>Moin,</p> <p>und schon haben wir das erste Problem. Ich brauche eine Struktur, den vorliegenden Daten entsprechend:</p> <pre><code class="block language-c"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">HUNT</span><span class="token punctuation">{</span> <span class="token keyword">char</span> <span class="token operator">*</span>title<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>descr<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token keyword">short</span><span class="token punctuation">;</span> <span class="token comment">// Konflikt</span> <span class="token keyword">char</span> <span class="token operator">*</span>body<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>cinterface<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>file<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>parent<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>isa<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>breadcrumb<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>class<span class="token punctuation">;</span> <span class="token punctuation">}</span>HUNT<span class="token punctuation">;</span> </code></pre> <p>Kann aber die Feldnamen nicht 1:1 übernehmen, beim Namen <code>short</code> streikt gcc. Gibt es dafür eine Lösung (außer umbenennen)?</p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742590#m1742590 Rolf B 2019-02-13T10:00:01Z 2019-02-13T10:00:01Z Zeiger Wettrennen <p>Hallo pl,</p> <p>reservierte Worte sind reservierte Worte. Das musst Du umbenennen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742598#m1742598 pl http://rolfrost.de/ddrende.html 2019-02-13T10:35:06Z 2019-02-13T10:35:06Z Zeiger Wettrennen <p>Habs's befürchtet. Is aber nicht das Einzige Problem. In Fakt bleib' ich bei meiner EAV Struktur und einer sequentiellen Suche </p> <p>MfG</p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742606#m1742606 Rolf B 2019-02-13T11:51:34Z 2019-02-13T11:51:34Z Zeiger Wettrennen <p><img src="/images/58c19e86-c33c-48d6-b3f3-e88c249d8ff3.gif" alt="" loading="lazy"></p> https://forum.selfhtml.org/self/2019/feb/10/zeiger-wettrennen/1742609#m1742609 pl http://rolfrost.de/ddrende.html 2019-02-13T12:43:25Z 2019-02-13T12:43:25Z Zeiger Wettrennen <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>Bei meinen derzeit 3000 Einträgen liegt faktisch kein Performanceproblem vor. Ein Index bringt da überhaupt nichts, ganz im Gegenteil: Ich müsste meine Datenstruktur komplett umbauen, das Deployment ändern und hätte dann einen Code der erheblich (!) aufwändiger zu pflegen wäre.</p> <p>Ein DB Designer würde sich das auch überlegen ob eine Tabelle mit mehr als 20 Feldern sinnvoll ist und genauso geht es mir da mit meiner Datensruktur.</p> <blockquote> <p><img src="/images/58c19e86-c33c-48d6-b3f3-e88c249d8ff3.gif" alt="" loading="lazy"></p> </blockquote> <p>Deine Entscheidung </p>