2015-08-10 25 views
6

Windows OS'de bu iki konsol uygulamasını başlatıyorum. İşte benim C# koduC# kodum neden C kodumdan daha hızlı?

burada
int lineCount = 0; 
StreamWriter writer = new StreamWriter("txt1.txt",true); 
for (int i = 0; i < 900; i++) 
{ 
    for (int k = 0; k < 900; k++) 
    { 
     writer.WriteLine("This is a new line" + lineCount); 
     lineCount++; 
    } 
} 

writer.Close(); 
Console.WriteLine("Done!"); 
Console.ReadLine(); 

Ve C kodu olmasıdır. Ben cstdio dahil edildi ve standart fopen ve fprintf işlevlerini kullanıyorum çünkü C olduğunu varsayalım.

FILE *file = fopen("text1.txt","a"); 

for (size_t i = 0; i < 900; i++) 
{ 
    for (size_t k = 0; k < 900; k++) 
    { 
     fprintf(file, "This is a line\n"); 
    } 
} 

fclose(file); 
cout << "Done!"; 

C# programını başlattığımda hemen "Done!" Iletisini görüyorum. C++ programına başladığımda (standart C fonksiyonlarını kullanır), tamamlamak için en az 2 saniye bekler ve bana "Bitti!" Mesajını gösterir.

Hızlarını test etmek için uğraşıyordum, ama şimdi bir çok şey bilmiyorum. Birisi bana açıklayabilir mi?

NOT: değil "Neden C# hızlı C++ daha çalışıyor?", Ben herhangi bir konsol çıktısını vererek değilim çünkü böyle "cout" veya "Console.Writeline()" olarak olası bir kopyası. Ben sadece programın ana görevini kesebilecek herhangi bir müdahale içermeyen filestri mekanizmasını karşılaştırıyorum.

+3

Uygulamalar, aynı işlemleri gerçekleştirmiyor. C# sürümü geçici bir dize nesnesi oluştururken, bu dosyaya yazılır, C++ kodu 'fprintf' çağırır (aslında herhangi bir biçimlendirme yapmadan). İkincisinin hala format dizisini ayrıştırması gerekiyor. Başka bir fark: .NET kodu, yerel dosya tanıtıcısının kapalı olmasını beklemez. Yönetilmeyen kod, ancak yapar. – IInspectable

+1

tamponlama, neden bir fstream kullanmıyorsunuz? –

+8

Belki de, "StreamWriter" bellek arabelleğine yazarken ve disk yazmalarını optimize ederken "fprintf" her satırı dosyaya akıtır. – Heavy

cevap

12

Elmaları ve patatesleri karşılaştırıyorsunuz. C/C++ programınız hiç arabelleğe alınmıyor. Eğer fstream'i tamponlama ile kullanacaksanız, sonuçlarınız çok daha iyi olacaktır: Ayrıca bkz. Bu std::fstream buffering vs manual buffering (why 10x gain with manual buffering)?

+9

Patatatolar nelerdir? Bir örnek isterim. – Nooble

+2

Bunlar patatesli tataşlardır. Neye benzediğini hayal et ... –

+2

Patatatoe bir yazım hatasıdır. Bildiğimiz tüm ingilizce konuşmuyoruz. –

0

Bu, dilleri arasındaki performansı karşılaştırmanın uygun bir yolu olduğunu düşünmüyorum. Benim düşüncemdeki ana fark C# 'nin yönetildiği bir dil olduğunda (arka planda çalışan ve optimizasyon gibi çok fazla iş yapan CLR var), C değilken, her neyse c ve C# tamamen farklı canavarlardır. . Bununla birlikte, dediğim gibi, ikisi arasında karşılaştırmak için çok fazla fark vardır.

+0

C bir canavar değildir. – khajvah

+9

@khajvah, [işte!] (Http://urban-rivals.wikia.com/wiki/C_Beast) – elgonzo

+0

CLR, JIT derleme kodunun ötesine geçmez, ilk kez çalıştırılır. Kesinlikle arka planda hiçbir şey yapmıyor ve optimizasyon kesinlikle yaptığı şeylerden biri değil. Sağladığı şey, bellek ayırmalarını çirkin bir şekilde hızlı hale getiren, genellikle herhangi bir CRT'den daha hızlı bir düzen (veya iki) daha hızlı hale getiren * sıkıştırılmış bir yığındır. – IInspectable