Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » _sehr_ langen vektor durchsuchen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] > 5 <
040
22.01.2009, 10:29 Uhr
~raps
Gast



Zitat von 0xdeadbeef:
Deine Beispielimplementierung zeigt in keiner Weise Optimierungen.
bei keiner der beiden versionen, das nennt man "vanilla code".


Zitat:
Die Probleme deiner Art der Hashtableverwendung habe ich schon erklärt, Hashing funktioniert stumpf nicht so, dass man einfach hinschreibt "hash jetzt!" und der Compiler die Hashtable automatisch so dimensioniert, wie man sie braucht und einen sinnvollen Hash auswählt.
das ist irrelevant, siehe mein vorheriger beitrag, wenn man mit perfekt gefuellter hashtable anfaengt mindert sich die laufzeit kaum. 18mal umallokieren bei 100 millionen zugriffen faellt kaum ins gewicht.


Zitat:

Wenn dein Beruf daraus bestünde, Programme zu optimieren, sollte dir dann bewusst sein, dass ein Array deiner Bittable-Größe niemals in den CPU-Cache passt. Ich hätte ein bisschen Kreativität beim Hashing mit mindestens SSE2 erwartet. Ich hätte zumindest eine Erwähnung der Probleme, in die du mit der Speicherverwaltung laufen kannst, erwartet. Ich hätte erwartet, dass du dir Gedanken darüber machst, wo der Speicher herkommen soll, und wie oft der Kernel ihn wohl aus der Auslagerung zurückholen muss.

ja, du haettest erwartet dass ich SSE2 benutze um einen 32bit wert auf 32bit mit Jenkins zu hashen. bei unseren vorstellungsgespraechen fragen wir solche grundlagen ab, ich glaube nicht dass hier in der firma jemand arbeitet der einen 32bit wert hashen wuerde.


Zitat:

Das, was du dir da ausgedacht hast, kann höchstens ein Mathematiker, der von einer Art "perfekter Architektur" ausgeht und die Realität nicht kennt, als Optimierung auffassen. Wenn mein Ton hier ungehalten klingt, dann liegt das daran, dass du mir mit deiner offenkundigen Inkompetenz, die du auch noch als eine Art göttliche Gabe darzustellen versuchst, verdammt auf die Eier gehst.

ja, so klingt es fuer mich auch. seit ich den ersten beitrag schrieb geh ich dir auf die eier, weil niemand etwas besseres vorschlagen darf als du, du musst auch nicht weiter darueber nachdenken, ich geh dir ja gleich auf die eier weil ich gotteslaesterung dir gegenueber betreibe. Deine anhaltenden beleidigungen/denunzierungen find ich, egal welche meinung man hat, unterstes soziales niveau.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
041
22.01.2009, 12:10 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst, was das Hashen angeht - den Jenkins-Hash habe ich, wenn du dich zurückerinnerst, im Zusammenhang mit Hashtables und ihrer Laufzeitabschätzung erwähnt. Einen sinnvollen Hash für diesen Fall kann ich ohne weitere Informationen über die erwartete Wertemenge natürlich nicht vorschlagen. Ich bezweifle zwar, dass wir entsprechende Informationen vom ursprünglichen Poster noch bekommen, aber wenn jemand einschätzen kann, dass er etwa 400000 verschiedene Werte kriegt, wird er auch eine grobe Vorstellung davon haben, welche das sein könnten - und dann ist die Identität mit großer Wahrscheinlichkeit alles andere als ein guter Hash.

Ansonsten, was die Skalierung der Hashtable in der "Vanilla-Implementierung" angeht...zwar ist mir, nachdem ich das gesehen habe, etwas klarer geworden, wie du auf die Idee kommst, dass das ganze mit einer Hashtable in O(n * log(n)) skaliere. Richtig ist es zwar auch da nicht, schon weil Zugriffe auf die Hashtable nicht mit dem gleichen n skalieren wie das Durchlaufen des Datenvektors, wenn ich das mal so salopp ausdrücken darf.

Wenn du deine Hashtable die ganze Zeit vollaufen lässt, kannst du natürlich keinen konstanten Zugriff auf die Werte erwarten, guter Hash hin oder her. Wenn zum Beispiel die Hashtable in deiner "Vanilla-Implementierung" gerade 393241 Werte beinhaltet, ist das Nachschlagen, ob ein Wert im Datenvektor schonmal gefunden wurde, plötzlich sehr teuer.

Der Punkt steht, Hashen funktioniert nicht so, dass man einfach hinschreibt "hash jetzt!" und etwas sinnvolles dabei rauskommt.

Was die Bittables angeht: Die praktischen Probleme, eben mal ein Achtel des verfügbaren Adressraums anzufordern, sind schon nicht zu unterschätzen, auch wenn sie lösbar sind. Laufzeittechnisch ist damit aber kaum etwas gewonnen, selbst wenn ausreichend Speicher vorhanden ist, dass das Betriebssystem nie auf die Idee kommt, irgendetwas auszulagern; wir skalieren auf einmal exponentiell mit der Registerbreite der Hostarchitektur. Der angeforderte Speicher nullt sich ja nicht von selbst.

Ja, wir sprechen von 100 Millionen Werten im Vektor, aber wir sprechen auf einer 32bit-Architektur schon von über 536 Millionen Byte in der Bittable. Allein der Aufwand, den du mit Paging und Initialisierung hast, geht schon weit über das hinaus, was man von einer vernünftig angewandten Hashtable zu erwarten hat. Und die 64bit-Architektur, inzwischen alles andere als ein exotisches Szenario, erwähne ich hier nur nochmal - das Problem sollte offensichtlich sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.01.2009 um 12:11 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] > 5 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: