Tôi đã thực hiện một vài năm của C# bây giờ và tôi đang cố gắng tìm hiểu một số nội dung mới. Vì vậy, tôi quyết định có một cái nhìn tại c + +, để tìm hiểu về lập trình theo một cách khác.Từ điển C# đến C++ đến kết quả unordered_map
Tôi đã thực hiện rất nhiều lượt đọc, nhưng tôi mới bắt đầu viết một số mã ngay hôm nay.
Trên máy tính Windows 764 bit của tôi, chạy VS2010, tôi đã tạo hai dự án: 1) Dự án C# cho phép tôi viết mọi thứ theo cách tôi đã quen. 2) Dự án C++ "makefile" cho phép tôi chơi xung quanh, cố gắng thực hiện cùng một điều. Từ những gì tôi hiểu, đây không phải là một dự án .NET.
Tôi đã cố gắng điền một từ điển có giá trị 10K. Đối với một số lý do, C++ là đơn đặt hàng của cường độ chậm hơn.
Đây là C# bên dưới. Lưu ý tôi đặt trong một chức năng sau khi đo lường thời gian để đảm bảo nó không phải là "tối ưu hóa" đi bởi trình biên dịch:
var freq = System.Diagnostics.Stopwatch.Frequency;
int i;
Dictionary<int, int> dict = new Dictionary<int, int>();
var clock = System.Diagnostics.Stopwatch.StartNew();
for (i = 0; i < 10000; i++)
dict[i] = i;
clock.Stop();
Console.WriteLine(clock.ElapsedTicks/(decimal)freq * 1000M);
Console.WriteLine(dict.Average(x=>x.Value));
Console.ReadKey(); //Don't want results to vanish off screen
Đây là C++, không nhiều suy nghĩ đã đi vào nó (cố gắng tìm hiểu, phải không?) int đầu vào;
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1, t2; // ticks
double elapsedTime;
// get ticks per second
QueryPerformanceFrequency(&frequency);
int i;
boost::unordered_map<int, int> dict;
// start timer
QueryPerformanceCounter(&t1);
for (i=0;i<10000;i++)
dict[i]=i;
// stop timer
QueryPerformanceCounter(&t2);
// compute and print the elapsed time in millisec
elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0/frequency.QuadPart;
cout << elapsedTime << " ms insert time\n";
int input;
cin >> input; //don't want console to disappear
Bây giờ, một số lưu ý. I managed to find this related SO question. Một trong những người đã viết một câu trả lời dài đề cập đến WOW64 nghiêng kết quả. Tôi đã thiết lập dự án để phát hành và đi qua tab "thuộc tính" của dự án C++, cho phép mọi thứ có vẻ như nó sẽ làm cho nó nhanh. Thay đổi nền tảng thành x64, mặc dù tôi không chắc liệu có giải quyết vấn đề wow64 của anh ấy hay không. Tôi không có kinh nghiệm với các tùy chọn trình biên dịch, có lẽ các bạn có nhiều hơn một đầu mối?
Ồ, và kết quả: C#: 0,32ms C++: 8,26ms. Điều này hơi lạ. Tôi đã hiểu sai về điều gì .Quad có nghĩa là gì? Tôi đã sao chép mã bộ đếm thời gian C++ từ một nơi nào đó trên web, trải qua tất cả cài đặt tăng cường và bao gồm/libfile rigmarole. Hoặc có lẽ tôi đang thực sự sử dụng các công cụ khác nhau một cách vô tình? Hoặc có một số tùy chọn biên dịch quan trọng mà tôi đã không được sử dụng? Hoặc có lẽ mã C# được tối ưu hóa bởi vì trung bình là một hằng số?
Đây là dòng C++ lệnh, từ tài sản Trang-> C/C++ -> Command Line: /I "C: \ Users \ Carlos \ Desktop \ boost_1_47_0"/Zi/nologo/W3/WX-/MP/Ox/Oi/Ot/GL/D "_MBCS"/Gm-/EHsc/GS-/Gy-/kiến trúc: SSE2/fp: nhanh/Zc: wchar_t/Zc: forScope/Fp "x64 \ Release \ MakeTest .pch "/ Fa" x64 \ Release \ "/ Fo" x64 \ Release \ "/Fd"x64\Release\vc100.pdb"/Gd/errorReport: hàng đợi
Mọi trợ giúp sẽ được đánh giá cao, cảm ơn.
Bạn đã thử std :: map thay vì tăng :: unordered_map? –
Đừng tin rằng câu trả lời khác quá nhiều. Bình luận của ông về WOW64 nói riêng là hoàn toàn off-base, có thể có một hình phạt cho các cuộc gọi hệ thống (mặc dù tôi không nghĩ rằng đó là thậm chí quan trọng) nhưng chắc chắn không phải cho toán học.Mã FPU x86 chạy nhanh với WOW64 như với bộ xử lý 32 bit. Khoảng một nửa những thứ khác trong câu trả lời đó là off-base. –
Vâng, tôi đã thử bản đồ, sau đó tôi đọc nó giống với SortedDictionary hơn. Đã chơi xung quanh với các loại, không có sự khác biệt. – Carlos