Autor Téma: Násobenie čísla, nie výrazu, jednotkou.  (Přečteno 4324 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7424
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #15 kdy: 06-04-2018, 08:47:44 »
Citace
Jen tak pro zajímavost, na jaké časy se chceš pro zpracování těch 20 tis záznamů dostat?
Ja to ešte netuším. Najprv musím spojazdniť celý výpočet. Potom si nahodiť dostatok údajov. Až potom uvidím, či je potrebné vôbec niečo riešiť. Len si teraz zháňam nejaké informácie.
V prílohe je obrázok, čo všetko riešim. Pre veľmi hrubú predstavu.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #16 kdy: 06-04-2018, 09:03:12 »
Tak násobení jedničkou není zrovna složitá operace. Povětšinou to zvládnu i z hlavy a ani počítačku nepotřebuju.
Embarcadero Technology Partner

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3516
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #17 kdy: 06-04-2018, 10:45:06 »
Citace
Jen tak pro zajímavost, na jaké časy se chceš pro zpracování těch 20 tis záznamů dostat?
Ja to ešte netuším. Najprv musím spojazdniť celý výpočet. Potom si nahodiť dostatok údajov. Až potom uvidím, či je potrebné vôbec niečo riešiť. Len si teraz zháňam nejaké informácie.
V prílohe je obrázok, čo všetko riešim. Pre veľmi hrubú predstavu.

LOL, ten obrázek mi leccos vysvetluje, já jsem si od začátku myslel, že 10 bytov znamená slovensky 10 bajtů, nikoliv 10 obytných jednotek.

Už mlčím - ale být tebou bych spíše se začal ptát až budeš mít pocit, že chceš něco zrychlit, než na začátku zjišťovat teoretické věci.
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7424
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #18 kdy: 06-04-2018, 11:42:05 »
Citace
já jsem si od začátku myslel, že 10 bytov znamená slovensky 10 bajtů
:D Aké je to programovanie záludné. Ja s tým žijem a taká možnosť mi neprišla na um.
Druhú vetu si beriem k srdcu.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline našinec

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 5
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #19 kdy: 06-04-2018, 13:13:25 »
Tak tato vzniká komunikační šum.  ;D  Ale s ohledem na to, co věčně řeší Stano, tak mi bylo hned jasné, že se jedná o obytné jednotky, zatímco u Radkova příspěvku bylo hned jasné, že hovoří o veličině. Každopádně s ohledem na následující reakce jsem zapochyboval o správnosti svých úvah.
Jinak, nevím, zda jsem správně pochopil Stanův dotaz, ale dle mého matematický úkon proběhne vždy. Neproběhne, pokud to ošetříš. Otázkou je, zda tím něco získáš.  ;)

--------Pozdější dovětek------------

Mimochodem Stano, pojem 'jednotka' se v češtině používá právě v souvislosti s bydlením - bytová jednotka.  ;)  ;D
« Poslední změna: 06-04-2018, 13:22:23 od našinec »

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1586
  • Karma: 52
    • Verze Delphi: 11.3
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #20 kdy: 06-04-2018, 14:25:28 »
Jinak nějakou optimalizaci si dělá i procesor, takže bych to v kódu pro 20 tisíc položek rozhodně neřešil.
Násobení jedničkou mu jde rychleji než násobení nějakým ošklivým číslem.

U mě to vyšlo zhruba 35578919 tiků pro násobení jedničkou a 35653693 tiků pro násobení tím ošklivým číslem.


Kód: Delphi [Vybrat]
  1.  var a:integer;
  2.      t:tStopWatch;
  3.      x,y,z:UInt64;
  4.  begin
  5.  t:=t.Create;
  6.  x:=$cfcfcfcfcfcfcfcf;
  7.  y:=1;
  8.  t.Start;
  9.  for a:=1 to $7FFFFFFF do z:=x*y;
  10.  t.Stop;
  11.  v1.Caption:=IntToStr(t.ElapsedTicks);
  12.  //
  13.  x:=$cfcfcfcfcfcfcfcf;
  14.  y:=$fcfcfcfcfcfcfcfc;
  15.  t.Reset;
  16.  t.Start;
  17.  for a:=1 to $7FFFFFFF do z:=x*y;
  18.  t.Stop;
  19.  v2.Caption:=IntToStr(t.ElapsedTicks);
  20.  


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3516
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #21 kdy: 06-04-2018, 14:34:03 »
vandrovnik: no a kdyz uz jsi v tom, tak jsi to mohl zkusit i v realnych číslech proti 64bit kompilatoru a s
Kód: Delphi [Vybrat]
  1. {$EXCESSPRECISION ON} nebo {$EXCESSPRECISION OFF}
  2.  

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Floating_point_precision_control_%28Delphi_for_x64%29
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1586
  • Karma: 52
    • Verze Delphi: 11.3
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #22 kdy: 06-04-2018, 16:05:59 »
Excellent
Rated 2 times
No, nedalo mi to :-) Musím říct, že některé výsledky mě docela překvapily - třeba že single není rychlejší než double a že single víceméně stejně rychlý jako nativní integer, natož jak dopadne, když si člověk nenastaví EXCESSEXPRESSION OFF... (Hádám, že pokud by se měly např. počítat goniometrické funkce, tak by už single rychlejší bylo.) To měření času není moc přesné, i když se ve správci úloh nastaví priorita Reálný čas, stejně výsledky dost lítají. Testováno na obstarožním i7 920 @ 2,67 GHz, Win 10 64bit.

-----------

32bit app, uint32,
x:=12345678; y:=1; -------> 13957016
x:=12345678; y:=87654321; -------> 13998208

32bit app, uint64,
x:=1234567812345678; y:=1; -------> 35580995
x:=1234567812345678; y:=8765432187654321; -------> 35651912

32bit app, single,
x:=1234.5678; y:=1; -------> 14020182
x:=1234.5678; y:=8765.4321; -------> 14016425

32bit app, double,
x:=1234.5678; y:=1; -------> 12151941
x:=1234.5678; y:=8765.4321; -------> 12156582

------------

64bit app, uint32,
x:=12345678; y:=1; -------> 13163029
x:=12345678; y:=87654321; -------> 13419768

64bit app, uint64,
x:=1234567812345678; y:=1; -------> 13330492
x:=1234567812345678; y:=8765432187654321; -------> 13453193

64bit app, single, {$EXCESSPRECISION OFF}:
x:=1234.5678; y:=1; -------> 12677965
x:=1234.5678; y:=8765.4321; -------> 13731444

64bit app, single, {$EXCESSPRECISION ON}, popř. {$EXCESSPRECISION... ručně nenastaveno:
x:=1234.5678; y:=1; -------> 22079486
x:=1234.5678; y:=8765.4321; -------> 22047472

64bit app, double, {$EXCESSPRECISION OFF}:
x:=1234.5678; y:=1; -------> 14053849
x:=1234.5678; y:=8765.4321; -------> 14060714

64bit app, double, {$EXCESSPRECISION ON}, popř. {$EXCESSPRECISION... ručně nenastaveno:
x:=1234.5678; y:=1; -------> 14023874
x:=1234.5678; y:=8765.4321; -------> 14024711

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Násobenie čísla, nie výrazu, jednotkou.
« Odpověď #23 kdy: 08-04-2018, 20:40:42 »
Ano, vzdycky plativalo, ze co jde vyhodnotit jako invariant v dobe prekladu, tak se pri prekladu vyhodnoti. Jinak by to snad ani nebyl prekladac, ale nejaka parodie.
No, vždycky platívalo... Co jsem si to kdysi zkoušel u stringů, tak tam to platilo jen v jednom směru - konst1 + konst2 + var1 se převedlo na konst3 + var, ale var1 + konst1 + konst2 zůstalo beze změny.