Я сделал несколько лет С# сейчас, и я пытаюсь изучить некоторые новые вещи. Поэтому я решил посмотреть на С++, чтобы узнать программирование по-другому.
Я делал много чтения, но сегодня начал писать код.
На моей машине с Windows 7/64 бит, запускающий VS2010, я создал два проекта: 1) Проект С#, который позволяет мне писать вещи так, как я привык. 2) Проект "makefile" С++, который позволяет мне играть, пытаясь реализовать одно и то же. Из того, что я понимаю, это НЕ проект .NET.
Мне нужно заполнить словарь значениями 10K. По какой-то причине С++ на несколько порядков медленнее.
Здесь С# ниже. Примечание. Я положил функцию после измерения времени, чтобы убедиться, что компилятор не "оптимизирован":
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
Здесь С++, не так много думал об этом (пытаясь узнать, правильно?) int input;
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
Теперь, некоторые оговорки. Мне удалось найти этот связанный вопрос SO. Один из парней написал длинный ответ, в котором упоминалось, что WOW64 искажает результаты. Я установил проект для выпуска и перешел на вкладку "Свойства" проекта С++, включив все, что звучало так, как будто бы это ускорилось. Изменена платформа для x64, хотя я не уверен, что это касается его проблемы с wow64. Я не настолько разбираюсь в настройках компилятора, возможно, у вас, ребята, есть больше намека?
О, и результаты: С#: 0.32ms С++: 8.26ms. Это немного странно. Я что-то неправильно истолковал о чем. Я скопировал код таймера С++ из какого-либо места в Интернете, пройдя всю установку boost и включив /libfile rigmarole. Или, может быть, я действительно использую разные инструменты невольно? Или там какой-то критический параметр компиляции, который я не использовал? Или, может быть, код С# оптимизирован, потому что среднее значение является константой?
Здесь строка командной строки С++, на странице свойств → C/С++ → Command Line: /I "C:\Users\Carlos\Desktop\boost_1_47_0" /Zi/nologo/W 3/WX-/MP/Ox/Oi/Ot/GL/D "_MBCS" /Gm -/EHsc/GS-/Gy-/arch: SSE2/fp: fast/Zc: wchar_t/Zc: forScope/Fp "x64\Release\MakeTest.pch" /Fa "x64\Release\" /Fo "x64\Release\" /Fd "x64\Release\vc100.pdb" /Gd/errorReport: queue
Любая помощь будет оценена, спасибо.