Close
Faqja 0 prej 2 FillimFillim 12 FunditFundit
Duke shfaqur rezultatin -9 deri 0 prej 20
  1. #1
    i/e regjistruar
    Anėtarėsuar
    17-11-2006
    Postime
    81

    performanca e C# vs C++

    Kohėt e fundit implementova nė njė program timin aftėsinė pėr t’i bėrė auto-update vetvetes. Pėrveē modifikimit tė vetė programit, kjo kėrkonte qė edhe serveri tė asistojė nė kėtė proces.

    Siti ėshtė implementuar nė ASP.NET MVC, por unė nuk jam njohės shumė i mirė i C#, kėshtu qė herė mbas here ndeshja vėshtirėsi, zgjidhjen e tė cilave e kėrkoja nė google, kryesisht tek www.stackoverflow.com.

    Dhe nė shumė raste, pėrveē zgjidhjes qė kėrkoja, ndeshja nė pohime tė tipit “C# mund tė ekzekutohet po aq shpejtė sa C++, madje edhe mė shpejtė, sepse JIT mund ta optimizojė kodin nė varėsi tė procesorit ‘host’”, apo “C# mund tė optimizohet mė shumė se C++, sepse nuk ka problem me aliasing (pėr shkak tė pointerave) siē ka C/C++, pėr mė tepėr JIT zotėron mė shumė informacion lidhur me intencionet e programit”.

    Unė nuk besoj se Sun apo Microsoft krijuan pėrkatėsisht Java dhe.NET ngaqė ishin tė pakėnaqur me performancėn e programeve C/C++. Gjithsesi, pėr tė krijuar njė ide, vendosa tė bėj njė eksperiment duke shkruar njė program tė thjeshtė nė C# dhe C++ (Java nuk kam):

    Nė kompjuterin tim, versioni nė C# ekzekutohet rreth 4 herė mė ngadalė se ai nė C++.
    Siē e thashė, unė nuk e njoh mirė C# dhe penalizmi mund t’i detyrohej faktit qė s’e kam shkruar mirė. Kėshtu qė sėrish kėrkova nė Google pėr tė parė se si mund ta optimizoja dhe ndėr tė tjera mėsova se performanca mund tė rritej duke e deklaruar funksionin ‘unsafe’ dhe duke pėrdorur pointera (nė C#) me anė tė keyword-it ‘fixed’.

    Gjithsesi, as kėto pėrpjekje s’patėn ndonjė rezultat.
    Kėshtu qė po e shtroj si “ushtrim” kėtu nė forum: ndokush njė njeh mė mirė C# (apo VB.NET... apo Java) mund tė ofrojė njė version mė tė optimizuar.

    Versioni nė C++ ėshtė ky:
    Kodi:
    #define	_WIN32_WINNT	NTDDI_WINXPSP2
    #define	WIN32_LEAN_AND_MEAN
    #include 
    #include 
    #include "stopwatch.h"
    #include 
    #include 
    #include 
    #include 
    
    #pragma optimize ("t", on)
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	const int               buffsize = 10;
    	__int64                 progresion = 0;
    	std::vector<__int64>    buffer(buffsize);
    	intein::Stopwatch       timer;
    
    	for (int i = 0; i <= 0x1FFFFFFF; i++)
    	{
    		progresion += i;
    		buffer[i % buffsize] += progresion;
    	}
    	timer.Stop();
    
    	printf ("progresion: %I64u\r\nkoha: %d\r\n\r\n", progresion, timer.ElapsedMilliseconds());
    	for (int i = 0; i < buffsize; i++)
    		printf ("%s%016I64x ", i % 4 ? "" : "\r\n", buffer[i]);
    
    	printf ("\r\n\r\n");
    	_getch();
    
    	return	0;
    }
    
    
    #pragma optimize ("", on)
    Ndėrsa ai nė C# ėshtė ky:
    Kodi:
    using System;
    
    namespace csharp1
    {
    	class Program
    	{
    		static unsafe void Main(string[] args)
    		{
    			const int                    buffsize = 10;
    			Int64                        progresion = 0;
    			Int64[]                      buffer = new Int64[buffsize];
    			System.Diagnostics.Stopwatch timer  = new System.Diagnostics.Stopwatch();
    
    			//fixed (Int64* pBuffer = buffer)
    			{
    				timer.Restart();
    				for (int i = 0; i <= 0x1FFFFFFF; i++)
    				{
    					progresion += i;
    					buffer[i % buffsize] += progresion;
    					//*(pBuffer + i % buffsize) += progresion;
    				}
    				timer.Stop();
    			}
    
    			System.Console.Write("progresion: {0}\nkoha: {1}\n\n", progresion, timer.ElapsedMilliseconds);
    			for (int i = 0; i < buffsize; i++)
    				System.Console.Write("{0}{1:x16} ", i % 4 != 0 ? "" : "\n", buffer[i]);
    
    			System.Console.Write("\n\n");
    			System.Console.ReadKey();
    		}
    	}
    }
    Linku i bashkangjitur i pėrmban tė dy projektet si dhe nga njė version tė kompiluar tė tė dy programeve.
    Skedarėt e Bashkėngjitur Skedarėt e Bashkėngjitur

  2. #2
    i/e regjistruar Maska e hot_prinz
    Anėtarėsuar
    29-05-2007
    Vendndodhja
    Frankfurt
    Postime
    9,878
    Pershendetje Neritan,


    si duket ky ushtrim ne Java eshte me i shpejte se C++, nese anashkalojme formatimin e printf . Cuditem pse ne C# eshte aq i ngadalshem.


    Kodi ne Java:
    Kodi:
    package program;
    
    public class Main {
    
        public static void main(String[] args) {
    
            final int buffsize = 10;
            long progresion = 0;
            long[] buffer = new long[buffsize];
            StopWatch t = new StopWatch();
    
            t.start();
            for (int i = 0; i <= 0x1FFFFFFF; i++) {
                progresion += i;
                buffer[i % buffsize] += progresion;
            }
            t.stop();
    
            System.out.println("progresion: " + progresion);
            System.out.println("koha: " + t.getElapsedTime() + "\n");
    
            for (int i = 0; i < buffsize; i++) {
                System.out.printf(Long.toHexString(buffer[i]) + " ");
            }
            System.out.println("\n\n");
    
        }
    
    }
    Pasi qe nuk lejohen skedare te tipit ".jar", skedari i bashkangjitur "Program.doc" emertohet ne "Program.jar" dhe nese gjindet ne "C:\" mund te ekzekutohet ne CMD me "java -jar "C:\Program.jar", nevojitet JDK (Java Development Kit) ose JRL (Java Runtime Environment).
    Fotografitė e Bashkėngjitura Fotografitė e Bashkėngjitura   
    Skedarėt e Bashkėngjitur Skedarėt e Bashkėngjitur

  3. #3
    i/e regjistruar
    Anėtarėsuar
    16-04-2004
    Postime
    674

    Dallimet jane fundamentale

    Dallimet mes .Net (c#, vb, etj) dhe java programeve ne njeren ane dhe programeve te "pamvaruna" (for the lack of a better term) ne anen tjeter jane fundamentale. ). Perderisa programet e mvaruna kerkojne sherbime nga nje strukture shtese (qofte .Net, qofte jvm) e tek pastaj me ndermjetesimin e kesaj strukture komunikojne me sistemin operativ, programet e pamvaruna komunikojn me SO ne menyre direkte. Pra nuk eshte fjala vetem ne ngecje me rastin e startimit te programit (JIT compilation) por edhe ne interaksionin me SO (garbage collection etj.). Rrjedhimisht C++ eshte me i shpejte, c edhe me i shpejte e keshtu me rradhe. Po neqoftese perfomancat jane me te dobeta atehere pse perdoren keto teknologji.

    Perparesite e managed code jane ne kufizimin e demit qe mund ta beje nje program me gabim, lehtesia per krijimin e software-it per probleme komplekse etj.

  4. #4
    i/e regjistruar Maska e hot_prinz
    Anėtarėsuar
    29-05-2007
    Vendndodhja
    Frankfurt
    Postime
    9,878
    mu duk interesante me e testu kete detyre edhe ne VB.Net.
    Pershkak se Int64 dhe Long sollen gabime "buffer(i Mod buffsize) += progresion" perdora tipin Decimal.
    Vlerat jane decimale dhe ndryshojne ne floating, sepse funksioni i VB hex$() nuk mund te ktheje nje Decimal me me shume se 19 shifra ne Hexadecimal.

    Java eshte ~ 43 here me e shpejte se VB.NET!

    Per aplikacione te avansuara VB.NET eshte humbje kohe.
    Si duket .NET ne pergjithesi nuk eshte e optimuar ndaj JRE.


    Kodi:
    Module Module1
    
        Sub Main()
    
            Const buffsize As Integer = 10
            Dim progresion As Decimal = 0
            Dim buffer(buffsize) As Decimal
            Dim timer As New System.Diagnostics.Stopwatch()
            Dim i As Long = 0
    
            timer.Start()
    
            For i = 0 To 536870911 '536870911(Long) = 0x1FFFFFFF(Hex)
    
                progresion += i
                buffer(i Mod buffsize) += progresion
    
            Next
    
            timer.Stop()
    
            System.Console.WriteLine("progresion: " & progresion.ToString())
            System.Console.WriteLine("koha: " & timer.ElapsedMilliseconds.ToString() _
                    & vbNewLine & vbNewLine)
    
            For i = 0 To buffsize - 1
                System.Console.Write(buffer(i) & " ")
            Next
    
            System.Console.Write(vbNewLine & vbNewLine)
            System.Console.ReadKey()
    
        End Sub
    
    End Module
    Fotografitė e Bashkėngjitura Fotografitė e Bashkėngjitura  
    Skedarėt e Bashkėngjitur Skedarėt e Bashkėngjitur

  5. #5
    i/e regjistruar
    Anėtarėsuar
    17-11-2006
    Postime
    81
    Pėrshėndetje hot_prinz

    Me shumė gjasa VB.NET ka njė performancė tė krahasueshme me C#, por veprimet aritmetike me tipin Decimal simulohen ne software (pėr procesorin nuk ekziston njė tip i tillė). Madje edhe MSDN e thotė:
    • Performance. The Decimal data type is the slowest of all the numeric types. You should weigh the importance of precision against performance before choosing a data type.


    Munda ta ekzekutoj programin Java nė njė kompjuter (netbook) qė kishte JRE dhe vetėm ~5% mė shpejtė se versioni C# ekzekutohet.

    Emri:  Capture.jpg

Shikime: 946

Madhėsia:  54.9 KB

    Nė fakt unė prisja qė versionet C# & C++ tė ekzekutoheshin pak a shumė njėlloj - nė fund tė fundit loop-i s’pėrmban gjė tjetėr veēse 2 mbledhje, 2 vlerėdhėnie dhe (vetėm aksidentalisht) njė modulo (%) – tė gjitha veprime elementare qė kryhen nė hardware.

    Kėshtu qė fillimisht dyshova se diferenca e madhe mund tė vinte ngaqė .NET mund tė verifikonte nėse ‘i % buffsize’ ndodhej brenda kufijve tė ‘buffer’ pėr ē’do vlerė tė ‘i’. Por fakti qė alternativa me pointer (nė rastin e C#) s’dha ndonjė rezultat, si dhe fakti qė versioni Java nė kompjuterin ku e testova unė ekzekutohet pak a shumė si versioni C#, ndėrsa nė kompjuterin tėnd pak a shumė si versioni C++ (tingėllon e ēuditshme qė JRE nė njė kompjuter tė bėjė ‘bound-checking’ dhe nė njė tjetėr jo), mė bėn tė dyshoj se s’ka tė bėjė me verifikimin nėse indeksi i ‘buffer’ ėshtė brenda kufijve.

    Unė nuk doja tė testoja skenarėt kur programet qė ekzekutohen nė njė VM performojnė mė keq se ato ‘native’ (autokton). Nė fakt doja t’i shmangja. Pėr kėtė arsye versionin C# u pėrpoqa ta shkruaj duke pėrdorur pointer ‘fixed (Int64* pBuffer = buffer)’, pėr tė eliminuar ‘bounds-checking’ qė supozova se mund tė kryente .NET-i.

    Mbasi tė shmangja pikat e dobėta tė VM, synoja tė bėja disa eksperimente duke shkruar fragmente tė ndryshme kodi brenda loop-it pėr tė parė se sa qėndronin pohimet se JIT mund tė optimizonte nė funksion tė procesorit ‘host’, si dhe ēfarė avantazhi mund tė kishte fakti se JIT zotėronte metadata, pėrkundrejt optimizuesve ‘offline’ tė C++ qė kanė gjithė natėn nė dispozicion pėr tė optimizuar. Jo se kėto programe tė vegjėl kėrkojnė shumė kohė pėr t’u optimizuar, por gjithsesi kisha ndėrmend tė fusja mė shumė “mish” brenda loop-it.



    Duke “gugluar” gjeta (ndėr tė tjera) disa gjėra humoristike.

    http://www.youtube.com/watch?v=xF0-LGoXtaw
    http://steve-yegge.blogspot.com/2010/12/haskell-researchers-announce-discovery.html
    http://steve-yegge.blogspot.com/2010/07/wikileaks-to-leak-5000-open-source-java.html
    http://steve-yegge.blogspot.com/2008/10/programmers-view-of-universe-part-1.html

    E fundit nuk ėshtė humoristike, gjithsesi ėshtė shkruar mjeshtėrisht. Ja vlen ta lexoni.

  6. #6
    i/e regjistruar Maska e hot_prinz
    Anėtarėsuar
    29-05-2007
    Vendndodhja
    Frankfurt
    Postime
    9,878
    Pershendetje Neritan,


    per VB, eshte e vertete se Decimal nuk mund te krahasohet, por me Int64 ose Long nuk funksiononte, prandaj e testova me Decimal.

    Duket shume interesante, une nuk i testova ne kompjutera tjere, perpos VB.Net ne pune dhe e shof se ketu ne shtepi ecen me shpejte, ja njehere specifikacioni i kompjuterit tim me Speccy dhe vlerat e ekzekutimeve me radhe.

    Mund te jete qe JRE eshte optimuar posaqerisht per tipat e ri te kompjutereve (une kam Intel i5) kurse ne ata me te vjeter kodi i C++ eshte me i shpejte!
    Fotografitė e Bashkėngjitura Fotografitė e Bashkėngjitura   

  7. #7
    i/e regjistruar
    Anėtarėsuar
    17-11-2006
    Postime
    81
    Kompjuterat ku i testova unė kishin procesor 64-bit, por Windows 32-bit. Gjithashtu, tė dy programet: C# & C++ ishin kompiluar pėr 32-bit. Dyshoj se kjo ėshtė arsyeja kryesore pse versioni nė C# ngelet aq mbrapa versionit nė Java. Do ishte kurioze ti kompiloje edhe ato pėr 64-bit.

  8. #8
    i/e regjistruar
    Anėtarėsuar
    16-04-2004
    Postime
    674
    Citim Postuar mė parė nga Neritan Hyso Lexo Postimin
    Unė nuk doja tė testoja skenarėt kur programet qė ekzekutohen nė njė VM performojnė mė keq se ato ‘native’ (autokton). Nė fakt doja t’i shmangja. Pėr kėtė arsye versionin C# u pėrpoqa ta shkruaj duke pėrdorur pointer ‘fixed (Int64* pBuffer = buffer)’, pėr tė eliminuar ‘bounds-checking’ qė supozova se mund tė kryente .NET-i.
    NET dhe jvm overhead verehet qysh nga alokimi i memories. Ne "unmanaged" code programi ne menyre direkte kerkon nga SO alokimin e memories, ndersa ne managed code kjo kalon neper disa shtresa, njera prej tyre sic e permenda me heret eshte GC (garbage collector) i cili e mban listen e vet te referencave ne menyre qe te dije se kur mundet te liroj nje bllok te memories dhe tja kthej ne disponim te SO.

    Nuk ka lidhje se cfar fute ne loop. Vet deklarimi dhe incializimi i variablave eshte me natyre te ndryshme mes managed dhe unmanaged code

  9. #9
    i/e regjistruar
    Anėtarėsuar
    17-11-2006
    Postime
    81
    Pėr kėtė arsye tė gjithė objektet krijohen pėrpara ‘timer. Restart()’ dhe eliminohen mbas ‘timer.Stop()’ – qė koha e tyre tė mos matet.
    Madje, pėr ta bėrė versionin C++ sa mė tė ngjashėm me atė C#, pėrdora
    std: : vector<__int64> buffer(buffsize);

    qė krijohet nė 'heap', si nė rastin e C#. Fillimisht e kisha
    __int64 buffer[buffsize];

    Gjithashtu, as ‘just-in-time-compilaton’ s’do duhej tė ndikonte, sepse kompilimi ndodh me “granularity” (imtėsi?) e njė funksioni, dhe asnjė funksion nuk thirret nė intervalin e kohės qė matet.
    Ndryshuar pėr herė tė fundit nga Neritan Hyso : 17-01-2011 mė 14:45

  10. #10
    i/e regjistruar
    Anėtarėsuar
    16-04-2004
    Postime
    674
    Une shqip po mundohem me ju tregue se ku eshte dallimi mes managed dhe unmanaged code, e ju apet po vazhdoni me JIT pallavra. ...

    JIT penaltia haset vetem ne lansimin e pare te programit dhe nuk ka lidhje me ekxekutimin e tij. Edhe nje her po ju tregoj:
    Dallimi mes managed code dhe unmanaged eshte se ne managed code cdo sherbim kalon neper nje shtrese te NET (ose JVM) dhe percillet tek SO. Ne rastin e NET kjo shtrese quhet CLR, dhe tere kohen e mbikqyre perdorimin e resurseve te kompjuterit (memorien etj.). Tek unmanaged code, CLR anashkalohet dhe programi eshte pergjegjes per alokimin/dealokimin e resurseve!

    Mjaft tjerrem lesh per kete ceshtje te thjeshte!
    Ndryshuar pėr herė tė fundit nga Uke Topalli : 17-01-2011 mė 15:13

Faqja 0 prej 2 FillimFillim 12 FunditFundit

Regullat e Postimit

  • Ju nuk mund tė hapni tema tė reja.
  • Ju nuk mund tė postoni nė tema.
  • Ju nuk mund tė bashkėngjitni skedarė.
  • Ju nuk mund tė ndryshoni postimet tuaja.
  •