kemi (statz) | #2, Főfasz (2970) |
4356 | #2460 | ^ | Idézet | Sun, 17 Mar 2013 22:24:36 +01 |
94.21.*.* | *.pool.digikabel.hu |
Ugyanaz a teszt, OOP vs imperatív megoldás, default, meg -O3 kapcsolókkal fordítva: rnd2.h #ifndef RND2_H_ #define RND2_H_ void srnd2(unsigned long int seed); unsigned long int rnd2(); #endif rnd2.cpp unsigned long int __seed0, __seed1, __seed2, __seed3; unsigned long int __rol(unsigned long int value, unsigned char offset) { offset = offset & 0x1f; return (value << offset) | (value >> (0x20 - offset)); } unsigned long int __ror(unsigned long int value, unsigned char offset) { offset = offset & 0x1f; return (value >> offset) | (value << (0x20 - offset)); } void srnd2(unsigned long int seed) { __seed0 = seed; __seed1 = __seed0 ^ 0xaaaaaaaa; __seed1 = __rol(__seed1 >> 11, __seed1); __seed1 = __seed1 ^ (__seed1 >> 21); __seed2 = __seed0 ^ 0x55555555; __seed2 = __ror(__seed2 << 6, __seed2); __seed2 = __seed2 ^ (__seed2 >> 22); __seed3 = (__seed2 << 16) | (__seed1 >> 16); } unsigned long int rnd2() { __seed1 = __rol(__seed1, 5); __seed2 = __ror(__seed2, 9); __seed0 = __rol(__seed0, 11); __seed0 ^= __seed1; __seed0 ^= __rol(__seed1, 8) << 11; __seed0 ^= __ror(__seed2, 8) & 63; __seed0 ^= __rol(__seed3, 8) >> 5; __seed0 = __ror(__seed0, 14); __seed0 ^= __seed3; __seed1 ^= __seed3; __seed2 ^= __seed3; __seed3 = __ror(__seed3, __seed0); return __seed0; } imp.cpp #include <cstdlib> #include <ctime> #include "rnd2.h" int main() { srnd2(time(NULL)); int table[256]; int i, j, k, r, temp; for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 256; k++) table[k] = k; for (k = 0; k < 256; k++) { r = rnd2() & 255; temp = table[r]; table[k] = temp; } } } return 0; } CRnd2.h #ifndef CRND2_H_ #define CRND2_H_ class CRnd2 { public: void srnd2(unsigned long int seed); unsigned long int rnd2(); private: unsigned long int __seed0; unsigned long int __seed1; unsigned long int __seed2; unsigned long int __seed3; unsigned long int __rol(unsigned long int value, unsigned char offset); unsigned long int __ror(unsigned long int value, unsigned char offset); }; #endif CRnd2.cpp #include "CRnd2.h" unsigned long int CRnd2::__rol(unsigned long int value, unsigned char offset) { offset = offset & 0x1f; return (value << offset) | (value >> (0x20 - offset)); } unsigned long int CRnd2::__ror(unsigned long int value, unsigned char offset) { offset = offset & 0x1f; return (value >> offset) | (value << (0x20 - offset)); } void CRnd2::srnd2(unsigned long int seed) { __seed0 = seed; __seed1 = __seed0 ^ 0xaaaaaaaa; __seed1 = __rol(__seed1 >> 11, __seed1); __seed1 = __seed1 ^ (__seed1 >> 21); __seed2 = __seed0 ^ 0x55555555; __seed2 = __ror(__seed2 << 6, __seed2); __seed2 = __seed2 ^ (__seed2 >> 22); __seed3 = (__seed2 << 16) | (__seed1 >> 16); } unsigned long int CRnd2::rnd2() { __seed1 = __rol(__seed1, 5); __seed2 = __ror(__seed2, 9); __seed0 = __rol(__seed0, 11); __seed0 ^= __seed1; __seed0 ^= __rol(__seed1, 8) << 11; __seed0 ^= __ror(__seed2, 8) & 63; __seed0 ^= __rol(__seed3, 8) >> 5; __seed0 = __ror(__seed0, 14); __seed0 ^= __seed3; __seed1 ^= __seed3; __seed2 ^= __seed3; __seed3 = __ror(__seed3, __seed0); return __seed0; } oop.cpp #include <cstdlib> #include <ctime> #include "CRnd2.h" int main() { CRnd2 rnd = CRnd2(); rnd.srnd2(time(NULL)); int table[256]; int i, j, k, r, temp; for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 256; k++) table[k] = k; for (k = 0; k < 256; k++) { r = rnd.rnd2() & 255; temp = table[r]; table[k] = temp; } } } return 0; } kemi242@linuxmint ~/a $ time ./imp real 0m21.088s user 0m21.077s sys 0m0.004s kemi242@linuxmint ~/a $ time ./imp_O3 real 0m2.430s user 0m2.424s sys 0m0.000s kemi242@linuxmint ~/a $ time ./oop real 0m29.269s user 0m29.266s sys 0m0.000s kemi242@linuxmint ~/a $ time ./oop_O3 real 0m2.454s user 0m2.444s sys 0m0.004s kemi242@linuxmint ~/a $Úgy látszik, az O3 kapcsoló nagyrészt kioptimalizálja az OOP hátrányait, ahol tudja. |
TCH (statz) | #1, Főfasz (10443) |
227 | #2461 | ^ | Idézet | Sun, 17 Mar 2013 22:46:24 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Ehen. De amúgy elég beszédes az eredmény, nem? Így egy kissé jobban érthető, miért preferálom az ojjektummentes dolgokat, nem? :P |
kemi (statz) | #2, Főfasz (2970) |
192 | #2462 | ^ | Idézet | Mon, 18 Mar 2013 07:47:50 +01 |
188.143.*.* | *.pool.digikabel.hu |
Az OOP megoldásnak megvan az az előnye, hogy tudsz egyszerre több egymástól független randomgenerátort használni. És elég jól kioptimalizálódott, hiszen csak néhány századmásodperccel lassabb. |
TCH (statz) | #1, Főfasz (10443) |
585 | #2463 | ^ | Idézet | Mon, 18 Mar 2013 12:23:47 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Imperatív megoldásnál talán nem? Egy algoritmusnál és egy objektumnál. Minél több ojjektum lesz benne, annál lassabb lesz. És ugye nem csak simán ojjektum, mert az még hagyján, de amikor az ojjektumból is ojjektum nyílik és a kiterjesztés kiterjesztésének a kiterjesztését is kiterjesztjük, akkor egy idő után utólérjük a dzsuva ciszta duót, hiszen azok műküdnek így. |
kemi (statz) | #2, Főfasz (2970) |
933 | #2464 | ^ | Idézet | Mon, 18 Mar 2013 15:18:45 +01 |
193.224.*.* | 193.224.*.* |
Nehezebb. Mondjuk hogy oldod meg, hogy lehessen egy eljárásban random számokat előállítani két különböző seeddel? Az Object-től minden osztály örökli a default konstruktort, destruktort, meg a default operátorokat. De azért ne felejtsd el, hogy ez gépi kódra fordul, és nem valami virtuális gép által értelmezett bytecode-ra. Van egy Blender nevű modellező progim, megvan a forráskódja is, szépen ledokumentálva. Írni kéne egy libraryt ami azt oldaná meg, hogy kívülről elérhetővé és manipulálhatóvá teszi a Blender belső objektumainak az adatait. Hogy fogjak hozzá? Május 15.-ig le kéne adni, ami itt van a nyakamon. :P |
TCH (statz) | #1, Főfasz (10443) |
490 | #2465 | ^ | Idézet | Mon, 18 Mar 2013 18:33:01 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Átadom a seedet is paramként? Plusz adatszerkezetet is ugye. Oké, ez igaz, de a gépi kód is sokkal trágyább lesz a ménkű sok ojjektumtól. |
gelesztamás (statz) | #24, Balfasz (26) |
757 | #2466 | ^ | Idézet | Mon, 18 Mar 2013 19:13:38 +01 |
80.99.*.* | *.catv.broadband.hu |
Ocsmányirodás kaland: Útlevél lejárt, irány az okmányiroda, sorszámhúzógép: "Rábasztál, nincs sorszám, nyaralni van a személyzet. Sry bro" Hát, a csudába, kénytelen vagyok hazamenni üres kézzel. Kijárat mellett volt egy utcára néző képernyő amin mindenféle hasznos hülyeség lett volna kiírva, ehelyett egy winfos 7 asztal volt rajta, a negyedét egy szöveges ablak foglalta el, tele mindenféle irománnyal. Az irományokat nem olvastam el, de gondolom ha az utca népének szólt volna, akkor egy formázott teljes képernyős szöveg lett volna, mint általában, ezért gondoltam, biztos egy hibaüzenet vagy ilyesmi. Azon gondolkoztam, hogy miért kell minden hivatalos intézménynek jópénzért windowst venni, amikor úgyis csak hibaüzeneteket nyom ki folyton? |
TCH (statz) | #1, Főfasz (10443) |
938 | #2467 | ^ | Idézet | Mon, 18 Mar 2013 21:59:47 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Akkor hogy a fárasba jutottál be az épületbe? Azért, mert az a ménkű sok pénzből amit a mikrofos a kormányoktól kap visszatol egy kicsit a megfelelő zsebekbe. Ellátogat a megfelelő mikrofosos üzletkötőTM Országunk Vezéréhez, vagy hét évvel ezelőtt a Gyártelep Fenegyerekéhez és megkötteték az üzlet, miszerint szegény magyar adófizetők zsebéből most informatikai beruházás címszó alatt circa 25 milliárd forint kivándorol a mikrofos zsebébe és utána a mikrofos ebből visszacsorgat a politikusok zsebébe 2-3 milliárdot. Na ezért van minden állami helyen (hivatalokban, iskolákban, védelmi szerveken, kórházakban) winfos meg officka. |
kemi (statz) | #2, Főfasz (2970) |
390 | #2468 | ^ | Idézet | Tue, 19 Mar 2013 12:18:40 +01 |
188.143.*.* | *.pool.digikabel.hu |
GTK-ban, meg Qt-ben is a GUI eleve OOP, meg a már említett képfeldolgozót az összes objektumstruktúrával együtt, sorról sorra fordítottam C#-ból C++-ba, és még úgy is 50-szer gyorsabb lett. A .NET/Java virtuális gép elég szűk keresztmetszet. Annál mindig gyorsabb lesz ugyanakkora komplexitás mellett. |
TCH (statz) | #1, Főfasz (10443) |
384 | #2469 | ^ | Idézet | Tue, 19 Mar 2013 13:01:29 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Én ezt nem vitatom, de az OOP mentes kód még annál is gyorsabb lenne. |
gelesztamás (statz) | #24, Balfasz (26) |
170 | #246a | ^ | Idézet | Tue, 19 Mar 2013 15:21:54 +01 |
80.99.*.* | *.catv.broadband.hu |
az épületben kell sorszámot húzni, és ott a váróterem, onnan hívogassák be az embert az ügyintéző elvtársakhoz |
kemi (statz) | #2, Főfasz (2970) |
3677 | #246b | ^ | Idézet | Tue, 19 Mar 2013 17:55:10 +01 |
188.143.*.* | *.pool.digikabel.hu |
Kíváncsi voltam melyik fordít hatékonyabb kódot, az fpc, vagy a gcc. rnd2.pas unit Rnd2; interface procedure srnd2(seed: Longint); function rand2: Longint; implementation var __seed0, __seed1, __seed2, __seed3: Longint; function __rol(value: Longint; offset: Byte): Longint; begin offset := offset and $1F; __rol := (value shl offset) or (value shr ($20 - offset)); end; function __ror(value: Longint; offset: Byte): Longint; begin offset := offset and $1F; __ror := (value shr offset) or (value shl ($20 - offset)); end; procedure srnd2(seed: Longint); begin __seed0 := seed; __seed1 := __seed0 xor $AAAAAAAA; __seed1 := __rol(__seed1 shr 11, __seed1); __seed1 := __seed1 xor (__seed1 shr 21); __seed2 := __seed0 xor $55555555; __seed2 := __ror(__seed2 shl 6, __seed2); __seed2 := __seed2 xor (__seed2 shr 22); __seed3 := (__seed2 shl 16) or (__seed1 shr 16); end; function rand2: Longint; begin __seed1 := __rol(__seed1, 5); __seed2 := __ror(__seed2, 9); __seed0 := __rol(__seed0, 11); __seed0 := __seed0 xor __seed1; __seed0 := __seed0 xor __rol(__seed1, 8) shl 11; __seed0 := __seed0 xor __ror(__seed2, 8) and 63; __seed0 := __seed0 xor __rol(__seed3, 8) shr 5; __seed0 := __ror(__seed0, 14); __seed0 := __seed0 xor __seed3; __seed1 := __seed0 xor __seed3; __seed2 := __seed0 xor __seed3; __seed3 := __ror(__seed3, __seed0); rand2 := __seed0; end; end. pas.pas program pas; uses Crt, Rnd2, SysUtils, DateUtils; var st: TSystemTime; table: Array[0..255] of Integer; i, j, k, r, temp: Integer; begin DateTimeToSystemTime(Now, st); srnd2(st.MilliSecond); for i := 0 to 999 do begin for j := 0 to 999 do begin for k := 0 to 255 do table[k] := k; for k := 0 to 255 do begin r := rand2 and 255; temp := table[r]; table[k] := temp; end; end; end; end. PS C:\Users\kemi242\Desktop\csc> measure-command {.\c.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 20 Milliseconds : 646 Ticks : 206461548 TotalDays : 0,000238960125 TotalHours : 0,005735043 TotalMinutes : 0,34410258 TotalSeconds : 20,6461548 TotalMilliseconds : 20646,1548 PS C:\Users\kemi242\Desktop\csc> measure-command {.\pas.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 23 Milliseconds : 625 Ticks : 236252006 TotalDays : 0,000273439821759259 TotalHours : 0,00656255572222222 TotalMinutes : 0,393753343333333 TotalSeconds : 23,6252006 TotalMilliseconds : 23625,2006 PS C:\Users\kemi242\Desktop\csc> measure-command {.\c_O3.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 938 Ticks : 9389131 TotalDays : 1,08670497685185E-05 TotalHours : 0,000260809194444444 TotalMinutes : 0,0156485516666667 TotalSeconds : 0,9389131 TotalMilliseconds : 938,9131 PS C:\Users\kemi242\Desktop\csc> measure-command {.\pas_O3.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 21 Milliseconds : 641 Ticks : 216414951 TotalDays : 0,000250480267361111 TotalHours : 0,00601152641666667 TotalMinutes : 0,360691585 TotalSeconds : 21,6414951 TotalMilliseconds : 21641,4951 Konklúzió: Hát bizony a Pascalos verzió lassabb lett, és az optimalizáció is csak néhány másodpercet dobott rajta. De nembaj, itt az rnd2 Pascal implementációja, használjátok egész seggel. |
TCH (statz) | #1, Főfasz (10443) |
543 | #246c | ^ | Idézet | Tue, 19 Mar 2013 23:30:53 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Jó én ezt értem, de ha nincs személyzet, akkor miért hagynak egyáltalán sorszámot húzni? Köszi. Viszont nem értem miért olyan lassú a Pascalos verzió. Szerintem nem az rnd2 miatt. Megmutatod a C teszt kódot is? |
TCH (statz) | #1, Főfasz (10443) |
167 | #246d | ^ | Idézet | Wed, 20 Mar 2013 01:27:17 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Brékingnyúz, az EU szerint nem okozunk kárt, ha zenét töltünk le. |
kemi (statz) | #2, Főfasz (2970) |
93 | #246e | ^ | Idézet | Wed, 20 Mar 2013 09:39:38 +01 |
193.224.*.* | *.uni-obuda.hu |
Ott van fent az előző postomban. Nem változtattam. |
Prometheus (statz) | #3, Főfasz (1824) |
45 | #246f | ^ | Idézet | Wed, 20 Mar 2013 09:49:29 +01 |
195.191.*.* | *.halozatszolgaltatas.hu |
TCH, pont most akartam ezt a cikket linkelni. |