Simple Container [Include]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Interessant :D

Ich habe deine Proceduren ein bisschen angepasst sodas man beliebig viel Versionen der Liste in einem SC - Container speichern kann und die ganze Liste in einem Eintrag, das ersparte einem eine menge Overhead:

Code: Alles auswählen

Macro _AddStringToMem(_Mem, _String, _SizeCounter)
  _Mem = ReAllocateMemory(_Mem, _SizeCounter + StringByteLength(_String) + SizeOf(Character) + SizeOf(Long))
  PokeL(_Mem + _SizeCounter, StringByteLength(_String) + SizeOf(Character))
  PokeS(_Mem + _SizeCounter + SizeOf(Long), _String)
  _SizeCounter + StringByteLength(_String) + SizeOf(Character) + SizeOf(Long)
EndMacro

Macro _AddLongToMem(_Mem, _Long, _SizeCounter)
  _Mem = ReAllocateMemory(_Mem, _SizeCounter + SizeOf(Long))
  PokeL(_Mem + _SizeCounter, _Long)
  _SizeCounter + SizeOf(Long)
EndMacro

Macro _GetStringFromMem(_Mem, _String, _SizeCounter)
  _String = PeekS(_Mem + _SizeCounter + SizeOf(Long), PeekL(_Mem + _SizeCounter))
  _SizeCounter + SizeOf(Long) + PeekL(_Mem + _SizeCounter)
EndMacro

Macro _GetLongFromMem(_Mem, _Long, _SizeCounter)
  _Long = PeekL(_Mem + _SizeCounter)
  _SizeCounter + SizeOf(Long)
EndMacro

Procedure SC_SavePersonen(SC, Id$, List Person.sPerson())
  Protected *SaveMem, MemSize,  ListCount, MainCount = ListSize(Person())
  
  *SaveMem = AllocateMemory(SizeOf(Long))
  PokeL(*SaveMem, MainCount)
  MemSize = SizeOf(Long)
  
  ForEach Person()
    
    ListCount = ListSize(Person()\Telefon())
    _AddStringToMem(*SaveMem, Person()\Vorname, MemSize)
    _AddStringToMem(*SaveMem, Person()\Nachname, MemSize)
    _AddLongToMem(*SaveMem, ListCount, MemSize)
    
    ForEach Person()\Telefon()
      _AddStringToMem(*SaveMem, Person()\Telefon()\Nummer, MemSize)  
      _AddStringToMem(*SaveMem, Person()\Telefon()\Typ, MemSize)  
    Next
    
  Next
  
  SC_AddEntry(SC, Id$, *SaveMem, MemSize)
  
EndProcedure

Procedure SC_LoadPersonen(SC, Id$, List Person.sPerson())
  Protected i, ii, *SaveMem, MemSize, ListCount, MainCount
  
  If SC_GetEntry(SC, Id$)
    
    *SaveMem = SC_GetMem(SC)
    MainCount = PeekL(*SaveMem)
    MemSize = SizeOf(Long)
    
    
    For i = 1 To MainCount
      AddElement(Person())
      _GetStringFromMem(*SaveMem, Person()\Vorname, MemSize)
      _GetStringFromMem(*SaveMem, Person()\Nachname, MemSize)
      _GetLongFromMem(*SaveMem, ListCount, MemSize)
      
      For ii = 1 To ListCount
        AddElement(Person()\Telefon())
        _GetStringFromMem(*SaveMem, Person()\Telefon()\Nummer, MemSize)
        _GetStringFromMem(*SaveMem, Person()\Telefon()\Typ, MemSize)
        
      Next  
      
    Next
    
  EndIf
  
EndProcedure
Hoffentlich kannst du das brauchen :D

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

cxAlex hat geschrieben:Hoffentlich kannst du das brauchen :D
Aber Hallo! :D

Vielen Dank für Deine Optimierungen & Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Update:
  • Logger eingebaut, nützlich für Debugzwecke
  • Transaction/Commit eingebaut, bei richtiger Verwendung viel Performancegewinn
  • LinkedLists auf PB - Listen umgestellt, per Macros gewrappt, leichter Performancegewinn
  • Header- & Indexkompression
  • BugFix: Header & Index werden nur mehr neu geschrieben wenn sich die Datei auch wirklich ändert

Download:
http://cxalex.bplaced.net/public/Simple-Conainer.zip

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

Bild

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Bitte :D

Eine genaue Beschreibung folgt noch, habe nur grade wenig Zeit, spätestens Morgen Vormittag gibts exakte Erklärungen zu den neuen Features.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

So wie versprochen:

Nachtrag/Erklärung zu den neuen Features:


Ein neues Feature in dieser Version ist der Logger, der sämtliche Aktionen von SC mit-zeichnet und später wiedergibt, bzw. sämtliche hinzugefügten/entfernten Dateien, fehlschlagen von Packvorgängen ... der Sinn ist wohl selbstverständlich, Debugzwecke usw ... .

Header&Index - Kompression wird nun unterstützt. Da sich die Headerinfos zu jedem Eintrag doch sehr ähneln lässt sich doch etwas Speicherplatz sparen. Das ganze passiert intern, kein weiteres Zutun ist nötig.

Eine sehr, sehr wichtige Neuerung ist das Transaction/Commit - System. Die Verwendung ist einfach: SC_Transaction() startet eine Transaction, SC_Commit() beendet sie.

Was passiert bei einer Transaction?
Man kann sämtliche SC - Befehle in einem Transaction/Commit - Block ganz normal weiterverwenden. Der Unterschied ist das SC sämtliche Änderungen aber nur im Cache durchführt, das ganze aber nicht! auf die Datei überträgt.

Was sind die Vorteile?
Sehr einfach und schnell erklärt: die Performance.
Wenn man viele, viele kleine Änderungen an der Datei vornimmt, viele Entrys hinzufügt/löscht usw. spart man sich dadurch viele Zugriffe auf die Datei und, wenn die Datei verschlüsselt ist, viele, viele Verschlüsselungsvorgänge die ja auch ihre Zeit brauchen. So wird alles auf einen rutsch Verschlüsselt und geschrieben, was die Performance der Anwendung gewaltig erhöhen kann.

Was sind die Nachteile?
Man muss sich im klaren sein das der Cache und der Inhalt der Datei auseinander laufen, inkonsistent werden. Stürzt die Anwendung ab bevor ein Commit ausgeführt wurde werden die Änderungen nicht in den Container übernommen. Das Transaction/Commit System funktioniert nur wenn der Speichercache aktiv ist!

Wann wird trotz Transaction in die Datei geschrieben?
Wenn der Speichercache voll ist, die vorgegebene Begrenzung erreicht ist, bzw. die Datei geschlossen wird.

Das Transaction/Commit System wird Intern noch weiterentwickelt. Ich würde mich freuen wenn ein paar Leute die SC vielleicht schon in ihren Projekten nutzen das ganze mal auf Herz und Nieren prüfen würden. Es gibt einfach zu viele Kombinationen aus Kompression/Verschlüsselung/usw... um das alleine testen zu können, über hier gefundene Bugs würde ich mich besonders freuen :D


Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Update:
  • Transaction/Commit optimiert, eigene Commit Liste, es muss nun nicht mehr der ganze Cache durchforstet werden.
  • BugFix: Cacheprobleme in der x86 Version behoben
  • BugFix: SC_Configure() konnte unter bestimmten Umständen zum Absturz führen
  • BugFix: x86/x64 Version sind nun wieder vollständig kompatibel
  • BugFix: SC_SetName() konnte mehrere Entrys mit demselben Namen erzeugen
Ein kleines Bugfix/Verbesserungs Release. Nun beginnt die Arbeit an einem Rollback für das Transaction/Commit System und Gruppierung von Einträgen, ähnlich Ordnern.

Download:
http://cxalex.bplaced.net/public/Simple-Conainer.zip

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: Simple Container [Include]

Beitrag von Rings »

cxAlex hat geschrieben:...
Download:
http://cxalex.bplaced.net/public/Simple-Conainer.zip
..
Nen Fehler im Namen (Conainer) , aber der Download geht trotzdem .

Danke für deine tolle Arbeit bisher.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Na sowas, dummer Fehler :oops:
Wird mit dem nächsen Release behoben.

Danke :D

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Neuer Download Link: http://files.cxalex.bplaced.net/secure. ... tainer.zip oder im 1. Post.

Neue Features sind in Arbeit. Gerade ist ein Asyncron-Modus implementiert worden (per JobQueue) der bereits ohne besondere Anpassungen merkbaren Performancegewinn bringen kann. Neues Release demnächst.

Zum Rollback: Ist das wirklich jemanden von nutzen, sonst würde ich das eher nicht implementieren, es würde (wenn man es nicht braucht) nur unnötig viel Speicher fressen und währe noch dazu intern sehr komplex, was sicher viele Bugs/lange Debugphasen bis zu einer stabilen Version verursachen würde.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten