Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: Geschwindigkeitsunterschiede bei Objekten/Pointern?

  Alt 6. Dez 2003, 14:04
Ach eines noch. Der Performancegewinn wurde aber wahrscheinlich aus einem ganz anderen Grund erreicht. Angenommen man hat viele Speicherkopieroperationen von einer Node in die andere (bei mir sind es Large Integer). Dann ist es wichtig zu wissen wie und warum die internen CPU Caches arbeiten. Die Caches arbeiten immer dann optimial wenn 1. die Speicherbereich an 64 Byte Grenzen ausgereichtet sind und 2. die Speichergrenzen der beiden Nodes/Large Integer nicht in der selben Page liegen. Besonders Punkt 2. ist enorm wichtig. Da mein Pool als FIFO arbeitet rotieren sozusagen die allozierten Speicher im Pool. Dadurch passiert es das der Pool succesive Speicherbereich auch meistens succesive im Cache halten kann. Von der Wahrscheinlichkeit her gesehen ist es also so das dieser Pool Objecte zur Verfügung stellt die in unterschiedlichen Cache-Pages liegen. Eine Speicherkopieroperation zwischen zwei solcher unabhäniger Cachelines ist dann sehr viel scheller und verhindert Cachmisses der CPU. Eineinzigster solcher Cachemiss kann ca. 200 Taktzyklen beanspruchen.

Wird beim Borland MM wiederholt ein Object mit gleicher Speichergröße alloziert und dealloziert so wird immer wieder der selbe Speicherbereich benutzt. Dies erscheint auf den ersten Blick als Cache-freundlich, ist es aber nicht. Da durch den anderen Inhalt des neuallozierten Objects ein Cache-refresh auf gleicher Cacheline nötig wird. Eine Cacheline ist aber meistens größer als 512 Bytes. Somit muß die CPU ganze 512 Bytes auffrischen und nachladen. Der Algorithmus heutger Cahces ist aber darauf optimiert das zufällige Speicheradressen nachgeladen und aufgefrischt werden müssen. Eben auf denn meist praktischen Gebrauch in einem PM OS. D.h. der Cache arbeitet relativ ineffizient wenn man sehr geordnete Speicherzugriffe durchführt. Deshalb gibt es ja auch im MMX/SSE Bereich Befehle die für's Audio/Video Streaming den Cache umgehen können. Bei solchen Operationen ist nämlich der Cache eine Bremse. Ähnliches passiert nun wenn man sehr viele wiederholte gleichgroße Speicherchunks alloziert und dealloziert.

Gruß Hagen
  Mit Zitat antworten Zitat