Atacuri la persoana, misto-uri ieftine [split from Download...]

Aici puteti sta la un pahar de vorba cu ceilalti membri despre orice subiect.
bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: Download Windows Vista Business 64bit

Post by bytefield » 17 Dec 2008, 13:59

neagu_laurentiu wrote:Nu se poate ! Esti in Release cu toate optimizarile puse ?!
Eu am 2GB RAM, P4 HT 3Ghz XP SP3 iar la rulare cu parametrii "1 100000000" obtin 15 s C# si 5s C++ !
Am compilat sub consola toate exemplele, fara nici un parametru in plus ;) (deci nici o optimizare)



neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Download Windows Vista Business 64bit

Post by neagu_laurentiu » 17 Dec 2008, 14:06

Sub Windows & Mono rezultatul e mai bun un pic fata de MS ! Dar nu se compara cu C++.
Si testeaza cu optimizari...ca nu degeaba sunt incluse.
Nu conteaza consola, e o monstra de cod generat/optimizat de JIT-ul atit de mult sustinut.

bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: Download Windows Vista Business 64bit

Post by bytefield » 17 Dec 2008, 17:14

Poate ca nu am fost eu prea explicit la rezultatele testului...
Prima parte a testului a fost sub Windows cu compilatoarele de la MS (csc pt. C# si cl pt C++), pe aceasta platforma C++ se evidenteaza clar fata de C#. A doua parte a testului a fost pe GNU/Linux (Ubuntu 8.10) cu compilatorul de la Mono (mcs pt. C#) si g++ pentru C++. Oricum e vorba ca sub Linux cu Mono, performantele sunt indentice cele ale codului C++ si C#, aici cred ca e de vina codul generat de g++.

Noile rezultate cu optimizari incluse
Cu optimizare -O3 pe linux cu g++, rezultatele pt. codul C++ este urmatorul: (btw, am modificat numele la functii si tipurile folosite in program, fiindca pe linux au alte denumiri, de ex. int64_t, time_t, etc.)
./Program 1 100000000
4.462117e+07
4 s
iar pentru Mono cu optimizari /o rezultatul este:
can@can-desktop:~$ mono Program.exe 1 100000000
44621168.4303905
00:00:06.3485660
44621168.4303905
00:00:06.3188720
Pe Windows, cu compilatoarele MS, cu optimizare pt viteza /O2 pentru C++ rezulta:
4.462117e+007
4 s
iar pt. C# cu optimizare /o rezultatul este:
44621168.4303905
00:00:09.1110000
44621168.4303905
00:00:08.9320000
Testele nu prea indica realitatea... caci am folosit platforme diferite...
Desktop: Intel QuadCore Q6600 si 4GB RAM, Linux cu Mono si g++
Laptop: Intel DualCore si 1GB RAM, Windows Vista cu CSC si CL
Am observat ca oricum C# nu se apropie de C++ nici cu optimizare. Vezi ultimele teste de pe Linux, e totusi o diferenta de 2 secunde.

L.E.:
neagu_laurentiu wrote:Nu se poate ! Esti in Release cu toate optimizarile puse ?!
Eu am 2GB RAM, P4 HT 3Ghz XP SP3 iar la rulare cu parametrii "1 100000000" obtin 15 s C# si 5s C++ !
E posibil sa ai alte versiuni de compilatoare de C++ si C#? Eu am testat cu cele de la VS 2008, pe Vista, fara SP1 ;) (acum imi fac update la Vista si-mi instaleaza SP1, oricum nu tin Vista pe Laptop decat pana ce trece sesiunea, aveam nevoie de Excel la PPS si cu OpenOffice e cam dificil de lucrat, daca la universitate facem toate exemplele pe Excel[softul asta proprietar a cam pus stapanire pe invatamantul romanesc... oare de ce nu le cumpara si studentilor licente daca tot ii obliga sa invete un program? :reallymad: sau sa ne lase in pace ca eu nu cred ca voi folosi vreodata Excel, ca programator, am alte planuri... ])

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Download Windows Vista Business 64bit

Post by neagu_laurentiu » 17 Dec 2008, 17:45

Am atasat cele doua proiecte aminitite (contin si executabilele)...
Attachments
cs.zip
(7.23 KiB) Downloaded 214 times
c.zip
(9.55 KiB) Downloaded 202 times

bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: Download Windows Vista Business 64bit

Post by bytefield » 17 Dec 2008, 18:20

C:\Users\Andrei\Downloads\cs\cs\bin\Release>cs 1 100000000
44621168.4303905
00:00:09.1520000
44621168.4303905
00:00:08.9800000

C:\Users\Andrei\Downloads\c\release>c 1 100000000
4.462117e+007
4 s
4.462117e+007
4 s

can@can-desktop:~/Desktop/cs/cs/bin/Release$ mono cs.exe 1 100000000
44621168.4303905
00:00:06.3829980
44621168.4303905
00:00:06.3210210

MORALA:
Un program scris in C++ se executa de 2 ori mai repede decat unul scris in C#, asta avand in vedere testele facute pe Windows, caci testul cu Mono e facut pe Linux si pe un CPU QuadCore care cu siguranta a influentat viteza programului in C# si il influenta si pe cel in C++ daca Laurentiu dadea si un executabil elf pt Linux ;)

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Download Windows Vista Business 64bit

Post by neagu_laurentiu » 17 Dec 2008, 18:57

La C++ diferenta de 1s fata de testul meu e explicabila numai prin viteza data de procesor (e acelsi cod .asm) pe cand la C# e clar ca JIT-ul optimizeaza mai bine pe acel procesor fata de al meu DAR nu suficient de bine precum stie VC++ generic :biggrin:
Asta nu inteleg eu: de ce nu au tras cu ochiul cei de la .NET la colegii de la VC++ ;)

Cryogenic
Membru
Membru
Posts: 55
Joined: 30 Jun 2008, 17:43

Re: Download Windows Vista Business 64bit

Post by Cryogenic » 17 Dec 2008, 21:21

bytefield wrote: MORALA:
Un program scris in C++ se executa de 2 ori mai repede decat unul scris in C#, asta avand in vedere testele facute pe Windows, caci testul cu Mono e facut pe Linux si pe un CPU QuadCore care cu siguranta a influentat viteza programului in C# si il influenta si pe cel in C++ daca Laurentiu dadea si un executabil elf pt Linux ;)
Cam repede ai sarit la tras concluzii ;)

uite si rezultatele mele pe Vista 64:

VS 2008 C++ console app cu : /O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Yu"stdafx.h" /Fp"Release\Test2.pch" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt

4.462117e+007
13 s

C# .Net 64 bit, 2 rezultate primul e pentru metoda C# copiata de aici, al doilea e pentru varianta scrisa de mine a metodei (cu mici optimizari)

44621168.4303905
xxx: 00:00:13.0872873

44621168.4303905
xxy: 00:00:11.5110942

si codul C# :

Code: Select all

using System;
using System.Diagnostics;

namespace ThreadTest
{
    class Program
    {
        public static void xxx(Int64 n, Int64 m)
        {
            double t = 0.0d;

            for (Int64 j = 0; j < n; j++)
            {
                t /= 1000.0d;

                for (Int64 i = 0; i < m; i++)
                {
                    t += i / 999999.0d;
                    double d = t * t + i;
                    double r = (t + d) / (200000.0d * (i + 1));
                    t -= r;
                }
            }
            Console.WriteLine(t);
        }

        public static void xxy(Int64 n, Int64 m)
        {
            double t = 0.0d;
            for (Int64 j = 0; j < n; j++)
            {
                t *= 1 / 1000.0d;

                for (Int64 i = 0; i < m; i++)
                {
                    t += i * (1 / 999999.0d);
                    t -= (t + t * t + i) / (200000.0d * (i + 1));
                }
            }
            Console.WriteLine(t);
        }

        static void Main(string[] args)
        {
            Int64 n;
            Int64 m;
            if (args.Length > 1)
            {
                n = Convert.ToInt64(args[0]);
                m = Convert.ToInt64(args[1]);
            }
            else
            {
                n = 5;
                m = 100000000;
            }
           
           // Pre jit
            xxx(1, 1);
            xxy(1, 1);

            Stopwatch sw = new Stopwatch();
            sw.Start();
            xxx(n, m);
            sw.Stop();
            System.Console.WriteLine("xxx: {0}", sw.Elapsed);

            sw.Reset();
            sw.Start();
            xxy(n, m);
            sw.Stop();
            System.Console.WriteLine("xxy: {0}", sw.Elapsed);
        }
    }
}
Metoda xxx e cea gasita pe forum, iar metoda xxy e optimizata de mine, si merge cu 10% mai repede.

Nu va obositi sa-mi spuneti ca nu sunt bune rezultatele pana nu testati pe 64 bit, pentru ca am testat pe .Net 32 bit si am vazut ca e aproximativ de 2x mai lent decat varianta C++, insa in .Net 64 bit chiar si prima metoda e mai rapida.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Download Windows Vista Business 64bit

Post by Ovidiu Cucu » 17 Dec 2008, 22:49

Mai ce-mi plac mie masuratorile astea! :)

Deci
  • 1. luam codul in discutie;
    2. cosmetizam pe ici / pe colo si dam variabilelor m si n o valoare super-bengoasa
    (cred ca 9223372036854775807i64 ajunge);

Code: Select all

#include <ctime>
#include <iostream>
void xxx(__int64 n, __int64 m)
{
   double t = 0.0;
   for (__int64 j = 0; j < n; j++)
   {
      t /= 1000.0;
      for (__int64 i = 0; i < m; i++)
      {
         t += i / 999999.0;
         double d = t * t + i;
         double r = (t + d) / (200000.0 * (i + 1));
         t -= r;
      }
   }
}

int main()
{
   __int64 n = 9223372036854775807i64; 
   __int64 m = 9223372036854775807i64; 

   time_t t1 = time(NULL);
   xxx(n,m);
   time_t t2 = time(NULL);
   std::cout << t2 - t1 << std::endl;
}
in continuare:
  • 3. tragem un build release cu VS2005/2008;
    4. lansam programul (nu trebuie cine stie ce super-computer)
MINUNEEE!!! Rezultatul este 0 (zero) secunde!
Compilatorul C++ nu numai ca-i mai tare ca luzerul ala de C# dar pare chiar mai tare si decat orice assembler!
INCREDIBIL!!!






// Well, sa nu de grabim cu inca o concluzie... E vorba de o optimizare a compilerului care observa ca functia xxx e pusa acolo degeaba, nu foloseste la nimic deci, asadar si prin urmare o ignora.
// Mai facem teste comparative? ;)

bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: Download Windows Vista Business 64bit

Post by bytefield » 17 Dec 2008, 22:59

Hey, Cryogenic, poate ai dreptate la faza cu 64 de biti, dar testul de pe Linux cu Mono era facut pe 64 biti, ma rog, nu am specificat, dar la un QuadCore era de asteptat ca nu pun SO pe 32 biti. Codul C++ nu l-am optimizat, doar l-am portat pe Linux pt ca varianta respectiva era scrisa special pt Windows. In plus nu am setat optimizarile la maxim, am pus doar optimizarea pt viteza.

Sunt oarecum uimit de rezultatele testului tau. La mine pe DualCore 2GHz pe Vista32 codul C++ nu are rezultate mai mari de 8 secunde, fara optimizari, pe QuadCore cu Ubuntu64 cel mai rau timp e de 6 sec. de altfel tot fara optimizari.
Cu optimizari de viteza am ajuns la 4 secunde pe Vista32 si Ubuntu64.
Ovidiu Cucu wrote:Mai ce-mi plac mie masuratorile astea! :)

Deci
  • 1. luam codul in discutie;
    2. cosmetizam pe ici / pe colo si dam variabilelor m si n o valoare super-bengoasa
    (cred ca 9223372036854775807i64 ajunge);

Code: Select all

#include <ctime>
#include <iostream>
void xxx(__int64 n, __int64 m)
{
   double t = 0.0;
   for (__int64 j = 0; j < n; j++)
   {
      t /= 1000.0;
      for (__int64 i = 0; i < m; i++)
      {
         t += i / 999999.0;
         double d = t * t + i;
         double r = (t + d) / (200000.0 * (i + 1));
         t -= r;
      }
   }
}

int main()
{
   __int64 n = 9223372036854775807i64; 
   __int64 m = 9223372036854775807i64; 

   time_t t1 = time(NULL);
   xxx(n,m);
   time_t t2 = time(NULL);
   std::cout << t2 - t1 << std::endl;
}
in continuare:
  • 3. tragem un build release cu VS2005/2008;
    4. lansam programul (nu trebuie cine stie ce super-computer)
MINUNEEE!!! Rezultatul este 0 (zero) secunde!
Compilatorul C++ nu numai ca-i mai tare ca luzerul ala de C# dar pare chiar mai tare si decat orice assembler!
INCREDIBIL!!!

// Well, sa nu de grabim cu inca o concluzie... E vorba de o optimizare a compilerului care observa ca functia xxx e pusa acolo degeaba, nu foloseste la nimic deci, asadar si prin urmare o ignora.
// Mai facem teste comparative? ;)
Atunci totul tine de compilator cand vorbim de viteza de executie, de codul generat de acesta si totusi un program in C# ruleaza mai greoi decat unul in C++ avand in vedere ca acestra trebuie sa treaca prin JIT prima data.
Plus ca atunci cand vine vorba de GC, daca nu-i dai uneori totul "mura-n gura" te lasa cu memoria in soare.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Download Windows Vista Business 64bit

Post by neagu_laurentiu » 18 Dec 2008, 00:03

Ovidiu Cucu wrote:Rezultatul este 0 (zero) secunde
E cunoscuta asta cu analiza facuta de compilator inainte, de asta am si ales varianta cu parametrii dati in consola tocmai ca sa nu-i cunoasca dinainte. La fel cu depistarea codului mort pe care nu-l mai include in .exe
Numai ca .NET-ul nu face astfel de optimizari.
Cryogenic wrote:uite si rezultatele mele pe Vista 64
Da, pe x64 performantele sunt egale la fel cum si pe x86 sunt egale daca se folosesc variabiIe pe 32 biti. Dar exemplul l-am ales intentionat cu variabile pe 64 biti in sistem pe 32.
Ai curaj sa testezi pe x64 cu variabile pe 128 biti ?

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Download Windows Vista Business 64bit

Post by Silviu Ardelean » 18 Dec 2008, 00:47

Baieti, azi, am asistat de la distanta, la un adevarat tur de forta pentru a-l convine ce Crylogenic...
Nu vreau sa se supere pe mine Crylogenic, dar as fi dispus sa fac un pariu cu Ovidiu, Laurentiu sau Dark ca nu veti reusii sa-l convingeti... El va crede in continuare in ideea lui.
Numai bine! :thumbup:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Download Windows Vista Business 64bit

Post by Ovidiu Cucu » 18 Dec 2008, 02:19

neagu_laurentiu wrote:
Ovidiu Cucu wrote:Rezultatul este 0 (zero) secunde
E cunoscuta asta cu analiza facuta de compilator inainte, de asta am si ales varianta cu parametrii dati in consola tocmai ca sa nu-i cunoasca dinainte. La fel cu depistarea codului mort pe care nu-l mai include in .exe
Numai ca .NET-ul nu face astfel de optimizari.
Eh... .NET-ul mai are un pic de invatat. :biggrin: ;)

Optimizarile de compiler mi-au dat de furca atunci cand am compilat sub VS2005 "problema celor N regine" cu care ne-am jucat mai demult pe aici: http://www.codexpert.ro/forum/viewtopic ... 2&start=15 .
Spre deosebire de problema de aici, acolo functia Queens::find_solutions nu era eliminata, se apela bine-mersi si rashnea vreo 30-40 de secunde, valoarea de return era folosita mai departe pentru a fi scrisa la consola (si iesea si corect) numai ca diferenta dintre valorile returnate de cele doua apeluri la time iesea tot timpul 0 (zero).

Pan-la urma am rezolvat cu volatile sau pragma optimize sau un mesaj mai mult sau mai putin dummy si alte metode mai mult sau mai putin ortodoxe. Daca tot ai spus mai inainte, am incercat si o "ascundere-valoare-parametri-la-compile-time" dar asta a costat nu mult dar a costat ceva performanta pt. ca am inlocuit un array C-style batut in cuie cu un std::vector.
In concluzie, tot volatile ramane cel mai sfant.

Ma intreb: daca odata si-odata cand .NET-ul va mai creste-o tzara si s-o pune serios pe optimizari, poate prea serios ca si in cazul pe care l-am povestit mai inainte... o fi si pe-acolo macar vreun mic volatile de salvare? :)

Cryogenic
Membru
Membru
Posts: 55
Joined: 30 Jun 2008, 17:43

Re: Download Windows Vista Business 64bit

Post by Cryogenic » 18 Dec 2008, 02:52

neagu_laurentiu wrote: E cunoscuta asta cu analiza facuta de compilator inainte, de asta am si ales varianta cu parametrii dati in consola tocmai ca sa nu-i cunoasca dinainte.
La fel cu depistarea codului mort pe care nu-l mai include in .exe
Numai ca .NET-ul nu face astfel de optimizari.
"Vaaaai", te rog nu mai scoate din burta afirmatii de genul, nu de alta, nu pentru mine sau pentru altii ci pentru propria-ti reputatie, arati ca habar nu ai de ce vorbesti. Trebuie sa fii in ultimul hal de neiformat/ignorat ca sa crezi ca cei ce au facut .Net-ul sunt idioti, adica sa nu includa optimizari de bun simptz in Jit (optimizari care se fac nu de ieri, nici nu era inventat C++-ul cand se faceau optimizari de genul "dead code elimination").

Ia compileaza codul asta in C# folosind "optimize code" (adica pe release):

Code: Select all

       static int Foo(int bar)
        {
            return bar * (10 - 2*5);
        }
si ai sa vezi in ce se traduce. in asta daca folosesti un IL disassembler :

Code: Select all

.method private hidebysig static int32 Foo(int32 bar) cil managed
{
    .maxstack 8
    L_0000: ldc.i4.0 // load constant "Zero" (i4 = Int32). Incarca 0 in evaluation stack
    L_0001: ret       // return din metoda o valoare in stack (0)
}
adica in :

Code: Select all

private static int Foo(int bar)
{
    return 0;
}

in plus asta e lista de optimizari care le face Mono 2.2 Preview 3 (aici e repository-ul) :

peephole Peephole postpass
branch Branch optimizations
inline Inline method calls
cfold Constant folding
consprop Constant propagation
copyprop Copy propagation
deadce Dead code elimination
linears Linear scan global reg allocation
cmov Conditional moves
shared Emit per-domain code
sched Instruction scheduling
intrins Intrinsic method implementations
tailc Tail recursion and tail calls
loop Loop related optimizations
fcmov Fast x86 FP compares
leaf Leaf procedures optimizations
aot Usage of Ahead Of Time compiled code
precomp Precompile all methods before executing Main
abcrem Array bound checks removal
ssapre SSA based Partial Redundancy Elimination
exception Optimize exception catch blocks
ssa Use plain SSA form
treeprop Tree propagation
sse2 SSE2 instructions on x86
gshared Share generics
simd Simd intrinsics[/list]

si aici cateva informatii legate de Jit-ul de la MS :
The CLR x86 JIT, an overview
JIT, NGen, and other Managed Code Generation Stuff
neagu_laurentiu wrote: Da, pe x64 performantele sunt egale la fel cum si pe x86 sunt egale daca se folosesc variabiIe pe 32 biti. Dar exemplul l-am ales intentionat cu variabile pe 64 biti in sistem pe 32.
Ai curaj sa testezi pe x64 cu variabile pe 128 biti ?
Uite ca sa te ajut iti dau o lista cu microbenchmark-uri http://www.ddj.com/cpp/184401976?pgno=1, alegele pe cele care avantajeaza C++-ul scrie un benchmark si dupa ai am sa vin si eu cu varianta in C# ca sa comparam.

Cryogenic
Membru
Membru
Posts: 55
Joined: 30 Jun 2008, 17:43

Re: Download Windows Vista Business 64bit

Post by Cryogenic » 18 Dec 2008, 02:59

Ovidiu Cucu wrote: Eh... .NET-ul mai are un pic de invatat. :biggrin: ;)
Invata invata, si e si constiicios pe deasupra ... ;)
Ovidiu Cucu wrote: Ma intreb: daca odata si-odata cand .NET-ul va mai creste-o tzara si s-o pune serios pe optimizari, poate prea serios ca si in cazul pe care l-am povestit mai inainte... o fi si pe-acolo macar vreun mic volatile de salvare? :)
Oricum optimizarile .Net (sau nici macar cele C++) nu cred ca o sa le bata pe cele din Java. Ia priviti gema asta de micro benchmark http://www.javaperformancetuning.com/news/qotm028.shtml

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Download Windows Vista Business 64bit

Post by Ovidiu Cucu » 18 Dec 2008, 03:17

Bine... nu pot sa cred ca un cod pre-compilat poate fi mai al dracului decat unul direct executabil oricat de destept ar fi precompilatoru, masina virtuala si garbage colectoru.
Ne-om bate si-n benchmark-uri da' nu acuma ca-i tarziu si maine tre sa fiu fresh la serbare... ;)

Post Reply