Autor Téma: Alfa verze synapse pro NextGen  (Přečteno 7423 krát)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Alfa verze synapse pro NextGen
« Odpověď #30 kdy: 04-04-2014, 23:45:55 »
Takova blba pripominka... pokud je TBytes v podstate dynamicke pole, tak plati i to, ze je pri alokaci jeho obsah nulovan, ne? To je pro mne naprosto zbytecna operace (obsah pameti stejne hned pote preplacnu svymi daty). Bojim se, ze to bude jen zdrzovat.

Ano je nulovan - volá System.DynArraySetLength.
Embarcadero MVP - Czech republic

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Alfa verze synapse pro NextGen
« Odpověď #31 kdy: 05-04-2014, 09:47:36 »
Pak se mi vtira myslenka, ze na binarni buffery neni TBytes z hlediska vykonu to nejlepsi. Bohuzel ani zadne derivaty, ktere interne pouzivaji dynamicka pole, ne?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Alfa verze synapse pro NextGen
« Odpověď #32 kdy: 06-04-2014, 00:54:46 »
Pak se mi vtira myslenka, ze na binarni buffery neni TBytes z hlediska vykonu to nejlepsi. Bohuzel ani zadne derivaty, ktere interne pouzivaji dynamicka pole, ne?

No já nevím, zda to v tomto případě řešit. Mazání paměti bude několika řádově rychlejší než jakákoliv komunikace po síti nebo zbytek cirkusu. Osobně bych to spíše neřešil.
Embarcadero MVP - Czech republic

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Alfa verze synapse pro NextGen
« Odpověď #33 kdy: 06-04-2014, 09:47:14 »
Ono asi zadne jine rozumne reseni neexistuje. Jen mne sejri, ze reseni, ktere mi embarcadero predhazuje jako stvorene pro binarni buffery, je ve skutecnosti neuveritelne pitome. Asi nechteji, aby v tom lide psali efektivni a rychle aplikace, aby je psali v necem jinem. Jinak si ty jejich kroky vysvetlit nedovedu.

Ono to mazani vypada jako prkotina, ale bude se to tam volat na kazdem rohu a je to zcela zbytecna operace. A ta musi v extremnich pripadech zdrzovat.

Ja si pamatuji nastup gigabitoveho ethernetu, kdy mnoho pomalejsich pocitacu v mnoha aplikacich proste nestihalo prehazovat data. A co dnes s 10G ethernetem? A co za pet, deset let? Mam pocit, ze ackoliv to vypada jako prkotina, jednoho dne se na to narazi.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Alfa verze synapse pro NextGen
« Odpověď #34 kdy: 06-04-2014, 20:58:03 »
Hmm, tak udelat něco co jsem předvedl já s tím synabytes, jen místo toho tam dát něco jako

buffer:Array [0..0] of byte a ten dynamicky alokovat - ale co na to ten stupidni nextgen kompilátor, to nevím.

Ono by to bylo asi celkem tak udělat (přes nějaký rekord), protože interně to pak může být libovolně měněno, máš možnost k tomu dávat metody na konverzi, ale přesto přímo přistupovat k tomu bufferu.

Ono mne tím EMBT celkem štve, protože slibovaný nextgen je (zatím) jen starý kompilátor, kde je uměle zakázán Ansi** a další.
Embarcadero MVP - Czech republic

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Alfa verze synapse pro NextGen
« Odpověď #35 kdy: 07-04-2014, 10:18:50 »
buffer:Array [0..0] of byte a ten dynamicky alokovat - ale co na to ten stupidni nextgen kompilátor, to nevím.

To nepůjde ani v normálním compileru! Asi spíš myslíš něco takového:
Kód: Delphi [Vybrat]
  1. type
  2.   PMyByteArray = ^TMyByteArray;
  3.   TMyByteArray = array[0..(High(Integer)-1)] of Byte;
  4.  
  5.  
  6.   TSynaBytes2 = record
  7.   private
  8.     FBuffer: PMyByteArray;
  9.   end;
  10.  

Ale to je pro daný případ taky absolutně nepoužitelné, protože by se dynamická pole při kopírování předávala přes referenci!!! Představ si něco podobného:

Kód: Delphi [Vybrat]
  1. procedure TestSynaBytes2;
  2. var
  3.   A, B: TSynaBytes2;
  4. begin
  5.   A := 'xyz';//do A je zapsáno "xyz"
  6.   B := A;//pozor B používá stejný buffer jako A!!!
  7.   B := 'abc';
  8.   ShowMessage(A);//A vyhodí "abc"!!!
  9. end;

Napsat si vlastní overloaded ":=" operátor v Delphi, který be se o kopírování bufferu postaral, IMHO nejde.

Nehledě na to, že pointery v recordech nejsou při inicializaci vynilovány, takže bys musel pro zjištění stavu použít ještě "trik se stringem" nebo "trik s interface"
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Alfa verze synapse pro NextGen
« Odpověď #36 kdy: 15-04-2014, 22:54:51 »
Ještě jsem narazil na jeden problém Radku. Ten tvůj TSynaByte neumí copy-on-write (protože Array of XYZ to neumí a tys to ručně nedodělával). Ukázat se to dá na tomto kódu:

Kód: Delphi [Vybrat]
  1. procedure TestCopyOnWrite;
  2. var
  3.   A, B: TSynaBytes;
  4. begin
  5.   A := 'abc';
  6.   B := A;
  7.   B[0] := 'x';
  8.   Writeln(String(A));//writes 'xbc' !!! no copy-on-write in TSynaBytes !!!
  9.   Readln;
  10. end;

Jsem si tak pro srandu napsal kompletní AnsiString replacement. Kompletní - to jest i včetně AnsiChar a PAnsiChar. Taky jsem zrušil kódování vázané na TORawByteString (v RawByteStringu taky žádné není), tak aby se dal použít jako doopravdický byte buffer. Taky vždy používám 1-based indexy pro AnsiString a 0-based indexy pro PAnsiChar (jak to vždycky v Delphi bylo).

Takže např. převod Synapse by teď teoreticky šel tak, že by se vlastně vůbec nic nepřevádělo, jen by se v ORawByteString.pas povolily implicitní konverze a šup, mělo by to fungovat. O všechno okolo (PAnsiChar, Pos(), Copy() a pod.) by se postaral ORawByteString.

Jen by se z důvodu rychlosti kódu měla změnit všechna volání Copy(), Delete(), Insert() na AnsiCopy(), AnsiDelete() a AnsiInsert() aby se AnsiString nepřeváděl na String a zpátky. Ale fungovalo by to i bez toho.

http://blog.kluug.net/2014/04/15/ansi-and-rawbytestring-for-delphi-mobile/
Embarcadero Technology Partner