2015-08-10 17 views
6

Tôi đang khởi chạy hai ứng dụng bảng điều khiển này trên Windows OS. Dưới đây là C# code của tôiTại sao mã C# của tôi nhanh hơn mã C của tôi?

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(); 

Và đây là mã C của tôi. Tôi giả sử đó là C vì tôi đã bao gồm cstdio và sử dụng các chức năng chuẩn fopenfprintf.

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!"; 

Khi tôi bắt đầu chương trình C#, tôi ngay lập tức thấy thông báo "Xong!". Khi tôi bắt đầu chương trình C++ (sử dụng các hàm C chuẩn), nó đợi ít nhất 2 giây để hoàn thành và hiển thị thông báo "Xong".

Tôi chỉ chơi xung quanh để kiểm tra tốc độ của chúng, nhưng bây giờ tôi nghĩ tôi không biết nhiều thứ. Ai đó có thể giải thích cho tôi?

LƯU Ý: Không thể trùng lặp "Tại sao C# chạy nhanh hơn C++?", Vì tôi không đưa ra bất kỳ đầu ra bàn điều khiển nào như "cout" hoặc "Console.Writeline()". Tôi chỉ so sánh cơ chế dòng phim không bao gồm bất kỳ sự can thiệp nào dưới bất kỳ hình thức nào có thể làm gián đoạn nhiệm vụ chính của chương trình.

+3

Các ứng dụng không thực hiện các thao tác giống nhau. Trong khi phiên bản C# xây dựng một đối tượng chuỗi tạm thời, nó được ghi vào tệp, mã C++ gọi 'fprintf' (không thực sự thực hiện bất kỳ định dạng nào). Sau này vẫn cần phải phân tích chuỗi định dạng. Một sự khác biệt: Mã .NET không chờ xử lý tệp gốc để đóng. Tuy nhiên, mã không được quản lý thực hiện. – IInspectable

+1

đệm có lẽ, tại sao bạn không sử dụng một fstream? –

+8

Có thể vì 'fprintf' xóa từng dòng vào tệp trong khi' StreamWriter' ghi vào bộ nhớ đệm và tối ưu hóa ghi đĩa. – Heavy

Trả lời

12

Bạn đang so sánh táo và khoai tây. Chương trình C/C++ của bạn không làm bất kỳ bộ đệm nào cả. Nếu bạn đã sử dụng một fstream với đệm kết quả của bạn sẽ tốt hơn rất nhiều: Xem thêm điều này std::fstream buffering vs manual buffering (why 10x gain with manual buffering)?

+9

Địa ngục là gì? Tôi muốn một mẫu. – Nooble

+2

Họ là khoai tây với tatas. Hãy tưởng tượng những gì trông giống như ... –

+2

Một patatatoe là một lỗi đánh máy. Chúng tôi không phải tất cả nói tiếng Anh tự nhiên bạn biết. –

0

Tôi không nghĩ đó là một cách thích hợp để so sánh hiệu suất giữa các ngôn ngữ.

Dù sao c và C# là con thú hoàn toàn khác nhau, khi sự khác biệt chính trong quan điểm của tôi là C# là ngôn ngữ được quản lý (có CLR chạy trong nền và thực hiện nhiều công việc như tối ưu hóa vv) trong khi C không .

Tuy nhiên như tôi đã nói, có quá nhiều sự khác biệt giữa hai để so sánh ở đây.

+0

C không phải là một con thú. – khajvah

+9

@khajvah, [đó là!] (Http://urban-rivals.wikia.com/wiki/C_Beast) – elgonzo

+0

CLR không làm được gì ngoài mã biên dịch JIT, lần đầu tiên nó được thực thi. Nó chắc chắn không làm bất cứ điều gì trong nền, và tối ưu hóa chắc chắn không phải là một trong những điều nó làm. Những gì nó cung cấp là một * nén đống * mà làm cho phân bổ bộ nhớ blazingly nhanh, thường là một đơn đặt hàng (hoặc thậm chí hai) nhanh hơn bất kỳ CRT nhất định. – IInspectable

Các vấn đề liên quan