https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/csharp.html
.NET Core mai rapid decat JVM, Java greu de crezut dar asa zic benchmarkurile.
Aici nu mi se pare fair
Ei zic ca ar trebui sa folosesti acelasi algoritm, dar implemetarile sunt complet diferite. Pe langa faptul ca varianta in C# foloseste cod unsafe(pointeri si aritmetica) plus biblioteca PCRE pe care o foloseste prin DllImport
Discutia HN
https://news.ycombinator.com/item?id=24241242
Din câte știu eu. Net Core e cross platforma ar pica varianta DllImport într-adevăr în C# poți declara secțiuni unsafe unde sa lucrezi cu pointer și codul e rapid.
Desigur @Cosmin_Popescu dacă ai articole sa îți susțină argumentele le poți posta oricum .net core e open source și se poate verifica.
Te uiti prin codul din benchmark si vezi ca este folosit
[DllImport("pcre2-8", EntryPoint = "pcre2_compile_8", CharSet = CharSet.Ansi)]
extern static IntPtr PcreCompile(string pattern, long length, uint options,
out int errorcode, out long erroroffset, IntPtr ccontext);
[DllImport("pcre2-8", EntryPoint = "pcre2_jit_compile_8", CharSet = CharSet.Ansi)]
extern static int PcreJitCompile(IntPtr code, uint options);
Iar in alte programe mai sunt si folosite lucrui specifice setului de intructiuni al procesorului.
https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/spectralnorm-csharpcore-5.html
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
private static void mult_Av(double* v, double* outv, int n)
{
Parallel.For(0, n, i =>
{
var sum = Vector128<double>.Zero;
for (var j = 0; j < n; j += 2)
{
var b = Sse2.LoadVector128(v + j);
var a = Vector128.Create(A(i, j), A(i, j + 1));
sum = Sse2.Add(sum, Sse2.Divide(b, a));
}
var add = Sse3.HorizontalAdd(sum, sum);
var value = Unsafe.As<Vector128<double>, double>(ref add);
Unsafe.WriteUnaligned(outv + i, value);
});
}
Conform documentatiei, este ceva intrinsec care este optimizat pt hardware.
Probabil ceva echivalent pt java ar fi asta
https://openjdk.java.net/jeps/338
Nota:
Just common sense and googling. Daca este cineva care stie mai multe dspre aceste lucrui, este invitat sa scrie
Incluisv Hotspot are anumite lucruri facute in asa fel incat sa aiba avantajul unuei executii mai rapide de catre hardware.
https://chriswhocodes.com/hotspot_intrinsics_jdk14.html
O alta discutie pe subiect
Benchmark daca citesti codul nu releva asa cum credeam performanta la namespace System.Text.RegularExpressions, ci doar folosesc ceva librari externe si feature de limbaj ca pointers si optimizari hardware, oricum am mai invatat cate ceva de pe postarea ta @Cosmin_Popescu.
Vesnica poveste cu benchmark-urile.
Aproape intotdeauna le face unul care cunoaste cat de cat un limbaj si aproape deloc pe celalalt, si nu e deloc obiectiv, favorizand bineinteles limbajul cunoscut…
Recent l-am vazut pe unul care pretindea ca python e de 10x mai rapid decat C++, pe ideea ca a scris el cod in python (ce apela o biblioteca scrisa in C, ‘munca’ nu era deloc facuta in python) care era de 10x mai rapid decat codul lui scris in C++, cu picioarele, in stil python.
Pasa argumente prin valoare, nu referinta, si ma refer aici la array-uri destul de mari. Facea alocari/delocari de-a-n boulea in for, cand putea sa aloce o singura data, inainte de for.
I-am sugerat la repezeala ce sa modifice, dar tot a ajuns sa aiba codul c++ ‘de doua ori mai lent’ decat codul ‘python’ (de fapt, C).
Era vorba despre fft, asa ca m-am mai uitat o data… cand am aruncat o privire mai atenta, am vazut individul facea benchmark intre o biblioteca C jalnica (aia apelata din python) si una dintre cele mai rapide biblioteci existente (aia apelata din C++). Cum a reusit performanta sa faca din una dintre cele mai rapide biblioteci o biblioteca mai lenta decat un jaf? Pai simplu, asta mai rapida permite tot felul de optimizari, creearea de ‘planuri’ pentru diverse cazuri. Sa faci un plan de-ala e destul de costisitor computational, iar el il re-crea de fiecare data cand apela biblioteca, desi nu era necesar, ajungea sa il faca o singura data, la inceput.
E usor sa poti sa ajungi sa declari C++ de 10x mai lent decat python. Si n-a fost creativ deloc, eu puteam rescrie codul C++ sa nu se termine niciodata si declaram python infinit mai rapid
Problema cu benchmark-urile este ca sunt utile nu le faci ca să te dai mare ci sa vezi cum poți optimiza un proiect, m-am uitat pe cod și e impropriu spus. Net core ca nu folosește librarii de. Net core iar ce folosesc în benchmark aproape nu o sa folosești niciodată în proiect, eu fac benchmark-uri sa vad ce pot schimba ca proiectul sa meargă mai repede sa vezi unde e bottleneck.
Visul la noi toți e sa lucram cu tehnologii rapide, nu ne place sa așteptăm să încarce o pagina, etc.
Intotdeauna solutia este ori un hardware mai puternic sau sa optimizezi codul.
Un tools interesant cu care poti face tracing si in IIS este dotTrace:
Partea nasoala ca daca vrei sa il iei trebuie sa iei tot pachetul pe luna dotUltimate care e 14$.
Din teste merge doar pe Windows si nu pe Linux.