TCH (statz) | #1, Főfasz (10443) |
586 | #2440 | ^ | Idézet | Thu, 14 Mar 2013 23:57:26 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Hát ki írta a drájvert? Természetesen, a C++ egy viszonylag kompakt kódot fog eredményezni, a másik kettő meg egy bloatware foshegyet, ami ráadásul 50x lassabb lesz a C/C++ verziónál. http://index.hu/tech/2013/03/14/tulmelegedes_okozta_az_outlook_leallasat/ XDDDDDDDDDDDDDDDDDDDDDDDD |
kemi (statz) | #2, Főfasz (2970) |
489 | #2441 | ^ | Idézet | Fri, 15 Mar 2013 07:57:55 +01 |
178.164.*.* | *.pool.digikabel.hu |
Úgy értettem, hogy aközött van-e különbség, ha C++-ban osztályba csomagolva valósítom meg, vagy nem. Amúgy C++-ban az OOP kód is sokkal gyorsabb mint dotnetben, meg dzsuvában. Meg legalábbis abban amekkora projekteket én csináltam, nem nagy kunszt odafigyelni, hogy takaríts is el magad után, mert nincs szemétgyűjtő. |
kemi (statz) | #2, Főfasz (2970) |
267 | #2442 | ^ | Idézet | Fri, 15 Mar 2013 10:11:52 +01 |
178.164.*.* | *.pool.digikabel.hu |
Ne vegyetek Ansmann akkut, mert egy kalap fos. 2500 mAh van ráírva, de a vezeték nélküli egeremben 3 nap alatt teljesen kidöglik. Ellenben a fényképezőgépemben használt Vartákkal teljesen meg vagyok elégedve. 5 éve megvannak, és még mindig remekül bírják a gyűrődést. |
TCH (statz) | #1, Főfasz (10443) |
1278 | #2443 | ^ | Idézet | Fri, 15 Mar 2013 12:35:15 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Ja. Lesz. Az OOP kód nagyobb és lassabb lesz. Persze nem annyira, mintha dzsuvában vagy cisztában csináltad volna, nagyságrendi különbség nem lesz, csak százalékos. Lévén a dzsuva meg a ciszta alapvetően kurwa lassú. Van is egy ötletem kemi! :) Bencsmárkoljuk ki, hogy mennyi idő alatt fut le sima C-ben, C++-ban, cisztában és dzsuvában egy kettős forciklus, a belső egymilliárd iterációval, a külső, meg ezerrel. Valamit tegyünk a belső forciklusba, amit nem hány ki az optimalizáló. Kiváncsi vagyok hányszoros lesz a különbség a C/C++ javára. Kis odafigyeléssel, szemétgyűjtőre nem nagyon van szükség. Csak mindig oda kell figyelni arra, hogy felszabadítsd azokat az ojjektumokat, streameket, amikat használtál. Varta rulez. A Sony TV-m távnyomijába valami oldszkúl Varta elem van 2000 környékéről és még megy. |
kemi (statz) | #2, Főfasz (2970) |
115 | #2444 | ^ | Idézet | Fri, 15 Mar 2013 13:26:09 +01 |
178.164.*.* | *.pool.digikabel.hu |
Ciklusváltozó kiírása megfelelő? |
TCH (statz) | #1, Főfasz (10443) |
210 | #2445 | ^ | Idézet | Fri, 15 Mar 2013 13:58:43 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Hát elméletileg igen, de akkor sose fut le, ha mind az egybilliószor ki kell írnia a konzolra. Csökkentsük le a belső ciklus iterációinak számát, legyen ezer az is. |
kemi (statz) | #2, Főfasz (2970) |
77 | #2446 | ^ | Idézet | Fri, 15 Mar 2013 14:38:31 +01 |
178.164.*.* | *.pool.digikabel.hu |
A külső ciklus 1000-szer, a belső 100-szor fut, mert így is kurva sokáig fut. |
kemi (statz) | #2, Főfasz (2970) |
2393 | #2447 | ^ | Idézet | Fri, 15 Mar 2013 15:04:52 +01 |
178.164.*.* | *.pool.digikabel.hu |
C/C++#include <stdio.h> //ugyanez a kód lefordul C meg C++ compilerrel is int main() { int i, j; for (i = 0; i < 1000; i++) { for (j = 0; j < 100; j++) { printf("%d\n", j); } } return 0; } Java package javatest; public class Main { public static void main(String[] args) { for (int i = 0; i < 1000; i++) { for (int j = 0; j < 100; j++) { System.out.println(j); } } } } C# class cs { static void Main() { for (int i = 0; i < 1000; i++) { for (int j = 0; j < 100; j++) { System.Console.WriteLine(j); } } } } PS C:\Users\kemi242\Desktop\csc> measure-command {.\c.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 978 Ticks : 9783411 TotalDays : 1,13233923611111E-05 TotalHours : 0,000271761416666667 TotalMinutes : 0,016305685 TotalSeconds : 0,9783411 TotalMilliseconds : 978,3411 PS C:\Users\kemi242\Desktop\csc> measure-command {.\cpp.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 1 Milliseconds : 155 Ticks : 11555819 TotalDays : 1,33747905092593E-05 TotalHours : 0,000320994972222222 TotalMinutes : 0,0192596983333333 TotalSeconds : 1,1555819 TotalMilliseconds : 1155,5819 PS C:\Users\kemi242\Desktop\csc> measure-command {.\cs.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 1 Milliseconds : 753 Ticks : 17532178 TotalDays : 2,02918726851852E-05 TotalHours : 0,000487004944444444 TotalMinutes : 0,0292202966666667 TotalSeconds : 1,7532178 TotalMilliseconds : 1753,2178 PS C:\Users\kemi242\Desktop\csc> measure-command {java -jar java.jar} Days : 0 Hours : 0 Minutes : 0 Seconds : 3 Milliseconds : 867 Ticks : 38679832 TotalDays : 4,47683240740741E-05 TotalHours : 0,00107443977777778 TotalMinutes : 0,0644663866666667 TotalSeconds : 3,8679832 TotalMilliseconds : 3867,9832 A measure-command parancs eldobja a kimenetet, az nem tudom változtat-e az eredményen valamit. |
TCH (statz) | #1, Főfasz (10443) |
321 | #2448 | ^ | Idézet | Fri, 15 Mar 2013 15:27:42 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Hát elvileg nem kéne. Viszont az egy kicsit meglep, hogy a ciszta csak másfélszer, a dzsuva meg csak három és félszer lassabb a C++-nál. Lehet, hogy az ilyen egyszerű algoritmusban nem tudnak mit elbaszni. :P Próbáld meg a measure command helyett stopperral lemérni, lehet, hogy mégis számít valamit a kimenet elvesztése. |
kemi (statz) | #2, Főfasz (2970) |
525 | #2449 | ^ | Idézet | Fri, 15 Mar 2013 17:16:58 +01 |
178.164.*.* | *.pool.digikabel.hu |
Írtam egy saját time parancsot.#include <QTime> using namespace std; int main(int argc, char *argv[]) { string command = ""; for (int i = 1; i < argc; i++) command += argv[i] + " "; QTime t; t.start(); system(command.c_str()); printf("\n%d ms\n", t.elapsed()); return 0; } C: 19807 ms C++: 19794 ms C#: 21010 ms Java: 20715 ms Így viszont a sok kiírás lassít, és azért nincs olyan nagy különbség köztük. |
TCH (statz) | #1, Főfasz (10443) |
87 | #244a | ^ | Idézet | Fri, 15 Mar 2013 19:23:12 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Valami bonyolultabban kéne kipróbálni. Mit szólsz a táblakeverőalgoritmushoz az RC-ből? |
kemi (statz) | #2, Főfasz (2970) |
134 | #244b | ^ | Idézet | Fri, 15 Mar 2013 19:53:45 +01 |
178.164.*.* | *.pool.digikabel.hu |
Oké. Töltsük fel, és utána keverjük a belső ciklusban, vagy inicializáljuk a tömböt feltöltjük, a ciklusban pedig csak keverés legyen? |
TCH (statz) | #1, Főfasz (10443) |
107 | #244c | ^ | Idézet | Fri, 15 Mar 2013 21:42:36 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Legjobb, ha a teljes algoritmus a mérés tárgyát képezi, feltöltés és keverés is. Vagyis a #1 opció a nyerő. |
kemi (statz) | #2, Főfasz (2970) |
3382 | #244d | ^ | Idézet | Fri, 15 Mar 2013 22:14:27 +01 |
178.164.*.* | *.pool.digikabel.hu |
Igyekeztem úgy megírni, hogy az összes nyelven ugyanaz legyen. C++-ban, C#-ban, meg Javában lehet a ciklusváltozót inicializáláskor deklarálni, C-ben viszont nem. De ha a többi változó a cikluson belül van deklarálva, akkor 1000*1000 = 1 milliószor fog memóriát lefoglalni, aztán felszabadítani, ha a ciklusokon kívül történik, akkor csak egyszer). C/C++ #include <stdlib.h> #include <time.h> int main() { srand(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 = rand() & 255; temp = table[r]; table[r] = table[k]; table[k] = temp; } } } } C# using System; class cs { static void Main() { Random rand = new Random(); int[] table = new int[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 = rand.Next(256); temp = table[r]; table[r] = table[k]; table[k] = temp; } } } } } Java package javatest; import java.util.Random; public class Main { public static void main(String[] args) { Random rand = new Random(); int[] table = new int[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 = rand.nextInt(256); temp = table[r]; table[r] = table[k]; table[k] = temp; } } } } } PS C:\Users\kemi242\Desktop\csc> measure-command {.\c.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 10 Milliseconds : 766 Ticks : 107667192 TotalDays : 0,000124614805555556 TotalHours : 0,00299075533333333 TotalMinutes : 0,17944532 TotalSeconds : 10,7667192 TotalMilliseconds : 10766,7192 PS C:\Users\kemi242\Desktop\csc> measure-command {.\cpp.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 10 Milliseconds : 512 Ticks : 105126138 TotalDays : 0,000121673770833333 TotalHours : 0,0029201705 TotalMinutes : 0,17521023 TotalSeconds : 10,5126138 TotalMilliseconds : 10512,6138 PS C:\Users\kemi242\Desktop\csc> measure-command {.\cs.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 8 Milliseconds : 175 Ticks : 81750915 TotalDays : 9,46191145833333E-05 TotalHours : 0,00227085875 TotalMinutes : 0,136251525 TotalSeconds : 8,1750915 TotalMilliseconds : 8175,0915 PS C:\Users\kemi242\Desktop\csc> measure-command {java -jar java.jar} Days : 0 Hours : 0 Minutes : 0 Seconds : 3 Milliseconds : 353 Ticks : 33531529 TotalDays : 3,88096400462963E-05 TotalHours : 0,000931431361111111 TotalMinutes : 0,0558858816666667 TotalSeconds : 3,3531529 TotalMilliseconds : 3353,1529 Vagy szar a gcc winfos alatt, vagy én kúrtam el valamit, vagy C#-ban meg Javában agyon van optimalizálva a tömbkeverés. :P |
TCH (statz) | #1, Főfasz (10443) |
333 | #244e | ^ | Idézet | Fri, 15 Mar 2013 23:17:42 +01 |
78.92.*.* | *.catv.pool.telekom.hu |
Milyen O paraméterrel futtattad a GCC-t? Ha semmilyennel, akkor futtasd O2 vagy O3 parammal. Meg próbáld ki a rnd2()-vel is, ne csak a beépítettel, lehet hogy abban van a turpisság, mert C/C++-ban van valamilyen random, cisztában/dzsuvában meg return 4; :P |
kemi (statz) | #2, Főfasz (2970) |
1022 | #244f | ^ | Idézet | Fri, 15 Mar 2013 23:23:23 +01 |
178.164.*.* | *.pool.digikabel.hu |
PS C:\Users\kemi242\Desktop\csc> measure-command {.\c.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 7 Milliseconds : 223 Ticks : 72233792 TotalDays : 8,36039259259259E-05 TotalHours : 0,00200649422222222 TotalMinutes : 0,120389653333333 TotalSeconds : 7,2233792 TotalMilliseconds : 7223,3792 PS C:\Users\kemi242\Desktop\csc> measure-command {.\cpp.exe} Days : 0 Hours : 0 Minutes : 0 Seconds : 7 Milliseconds : 119 Ticks : 71193099 TotalDays : 8,23994201388889E-05 TotalHours : 0,00197758608333333 TotalMinutes : 0,118655165 TotalSeconds : 7,1193099 TotalMilliseconds : 7119,3099 -O3 kapcsolóval már jobb egy picivel. A Java nem tudom miért olyan gyors. Lehet, hogy valami jobb randomgenerátor algoritmus van beléjük építve, meg kéne próbálni abból is a miénket használni. |