C# je rychlejší než C/C++?

C# je rychlejší než C/C++?
« kdy: 12. 04. 2013, 18:27:27 »
Nazdar!

Urobil som maly test a vysledok ma velmi prekvapil. Napisal som tento program v C#:

Kód: [Vybrat]
using System;

namespace TestApp
{
class Program
{
public static void Main(string[] args)
{
int n = 0;
for (var i = 0; i < 999999999; i++) {
n++;
}
}
}
}

a ten isty program v C:

Kód: [Vybrat]
int main() {
  int n = 0;
  for (int i = 0;  i < 999999999;  i++) {
    n++;
  }
}

C program je skompilovany pomocou gcc, C# je skompilovany v MonoDevelop. Toto su casy behu programov odmerane pomocou utility time:

C
real   0m3.507s
user   0m3.504s
sys   0m0.000s


C#
real   0m0.707s
user   0m0.692s
sys   0m0.012s


Z toho vyplyva, ze (samozrejme pre dany program, ktory je vsak dost vseobecny ohladne vykonu) C# je takmer 5x rychlejsi ako C.

Co na to hovorite?

PS: nie nijako som sa nepomylil!
« Poslední změna: 12. 04. 2013, 23:33:31 od Petr Krčmář »


Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #1 kdy: 12. 04. 2013, 18:33:59 »
Operacny system: Ubuntu 13.04
Mono 2.10.8.1
GCC 4.7.3

Jakub Galgonek

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #2 kdy: 12. 04. 2013, 18:34:55 »
C program je skompilovany pomocou gcc

A s jakými flagy?

Logik

  • *****
  • 854
    • Zobrazit profil
    • E-mail
Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #3 kdy: 12. 04. 2013, 18:37:02 »
JIT compilátor opravdu může bejt v některejch případech rychlejší. Ale tady bych spíš
čekal, že v jednom případě byl provedenej loop unroling či vektorizace, zatímco
v druhy, případě ne.

Chtělo by to flagy kompilátoru a hodně by pověděl i disassembling.

Program

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #4 kdy: 12. 04. 2013, 18:37:29 »
Podobným způsobem jsem si svýho času hrál, jen ne s C#, ale s Javou. Taky jsem se divil, že byla Java výrazně rychlejší, pak jsem zjistil, že jsem opomněl alespoň -O2 u gcc. Tím se C dostalo mírně před Javu.


Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #5 kdy: 12. 04. 2013, 18:37:56 »
C program je skompilovany pomocou gcc

A s jakými flagy?

So ziadnymi. Teraz som to vyskusal skompilovat s -std=c99 ale vysledok je uplne rovnaky.

DK

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #6 kdy: 12. 04. 2013, 18:38:26 »
tak to zkompiluj s -O3 :)

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #7 kdy: 12. 04. 2013, 18:40:33 »
tak to zkompiluj s -O3 :)
Tak s -O3 to uz facha na 0.003 :D sa vykon fakt zlepsil.

Vladimír

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #8 kdy: 12. 04. 2013, 18:41:42 »
Jak bylo řečeno výše, zdroják nestačí. Je nutné vědět,
co s tím provedl překladač v assembleru.

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #9 kdy: 12. 04. 2013, 18:44:41 »
tak to zkompiluj s -O3 :)
Tak s -O3 to uz facha na 0.003 :D sa vykon fakt zlepsil.
ale inac nebude to tym, ze s -O3 kompilator spravi take veci, ze uplne vynecha dany cyklus a dosadi do n rovno tu hodnotu, ktoru bude mat jasne na konci cyklu?

Jakub Galgonek

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #10 kdy: 12. 04. 2013, 18:49:03 »
ale inac nebude to tym, ze s -O3 kompilator spravi take veci, ze uplne vynecha dany cyklus a dosadi do n rovno tu hodnotu, ktoru bude mat jasne na konci cyklu?

O tom silně pochybuji. Ale koukni se na výsledný kód v assembleru (pomocí -S) a z něj to poznáš.

Jakub Galgonek

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #11 kdy: 12. 04. 2013, 18:54:33 »
ale inac nebude to tym, ze s -O3 kompilator spravi take veci, ze uplne vynecha dany cyklus a dosadi do n rovno tu hodnotu, ktoru bude mat jasne na konci cyklu?

O tom silně pochybuji. Ale koukni se na výsledný kód v assembleru (pomocí -S) a z něj to poznáš.

No jo, nemazlí se s tím, prostě to n vyhodí úplně :D

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #12 kdy: 12. 04. 2013, 18:54:43 »
Kedze assembler neovladam, davam vam tu tie kody:

bez -O3

   .file   "test.c"
   .text
   .globl   main
   .type   main, @function
main:
.LFB0:
   .cfi_startproc
   pushq   %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq   %rsp, %rbp
   .cfi_def_cfa_register 6
   movl   $0, -8(%rbp)
   movl   $0, -4(%rbp)
   jmp   .L2
.L3:
   addl   $1, -8(%rbp)
   addl   $1, -4(%rbp)
.L2:
   cmpl   $999999998, -4(%rbp)
   jle   .L3
   movl   $0, %eax
   popq   %rbp
   .cfi_def_cfa 7, 8
   ret
   .cfi_endproc
.LFE0:
   .size   main, .-main
   .ident   "GCC: (Ubuntu/Linaro 4.7.2-23ubuntu2) 4.7.3"
   .section   .note.GNU-stack,"",@progbits


s -O3 (super rychle)

   .file   "test.c"
   .section   .text.startup,"ax",@progbits
   .p2align 4,,15
   .globl   main
   .type   main, @function
main:
.LFB0:
   .cfi_startproc
   xorl   %eax, %eax
   ret
   .cfi_endproc
.LFE0:
   .size   main, .-main
   .ident   "GCC: (Ubuntu/Linaro 4.7.2-23ubuntu2) 4.7.3"
   .section   .note.GNU-stack,"",@progbits

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #13 kdy: 12. 04. 2013, 18:58:07 »
Ale podla mna je spravne porovnavat bez akychkolvek -O, pretoze vtedy kompilator C urobi len nejake vychytraciny (cheatuje :D) zatial co C# to musi vsetko spravit poctivo. Takze zatial za pravoplatne porovnanie povazujem to z mojho prveho prispevku.

Jakub Galgonek

Re:C# je rychlejsi ako C/C++?!?!
« Odpověď #14 kdy: 12. 04. 2013, 18:58:59 »
Kedze assembler neovladam, davam vam tu tie kody:

V prvním případě se normálně skáče (vykonává se for-cyklus) v druhém případě se nedělá nic (krom nastavení návratové hodnoty).