【发布时间】:2011-10-21 22:17:55
【问题描述】:
我现在已经做了几年的 c#,我正在尝试学习一些新东西。所以我决定看看 c++,以不同的方式了解编程。
我一直在做大量的阅读,但我今天才开始写一些代码。
在我的 Windows 7/64 位机器上,运行 VS2010,我创建了两个项目: 1) 一个 c# 项目,让我可以按照我习惯的方式编写东西。 2) 一个 c++“makefile”项目,让我玩弄,试图实现同样的事情。据我了解,这不是 .NET 项目。
我不得不尝试用 10K 值填充字典。由于某种原因,c++ 的速度要慢几个数量级。
这是下面的 c#。 请注意,我在时间测量后放入了一个函数,以确保编译器不会“优化”它:
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
这里是c++,没怎么考虑过(努力学习吧?) 整数输入;
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
现在,一些警告。 I managed to find this related SO question. 其中一个人写了一个很长的答案,提到 WOW64 扭曲了结果。我已将项目设置为发布,并浏览了 c++ 项目的“属性”选项卡,启用所有听起来会加快速度的东西。将平台更改为 x64,但我不确定这是否解决了他的 wow64 问题。我对编译器选项不是很有经验,也许你们有更多的线索?
哦,结果:c#:0.32ms c++:8.26ms。这有点奇怪。我是否误解了 .Quad 的含义?我从网络上的某个地方复制了 c++ 计时器代码,完成了所有 boost 安装和包含/libfile rigmarole。或者也许我实际上在不知不觉中使用了不同的工具?或者有一些我没有使用过的关键编译选项?或者可能因为平均值是常数而优化了 c# 代码?
这是 c++ 命令行,来自属性页->C/C++->命令行: /I"C:\Users\Carlos\Desktop\boost_1_47_0" /Zi /nologo /W3 /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:队列
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
你试过用 std::map 代替 boost::unordered_map 吗?
-
不要太相信其他答案。特别是他对 WOW64 的评论完全不合时宜,系统调用可能会受到惩罚(尽管我认为这并不重要)但绝对不是数学。 x86 FPU 代码在 WOW64 上的运行速度与在 32 位处理器上一样快。该答案中大约有一半的其他内容也是不合格的。
-
是的,我试过 map,然后我读到它更类似于 SortedDictionary。玩过各种类型,没有区别。
-
我根本无法重现该结果。我的简单 C++0x 实现始终比您的 C# 版本快很多。我正在使用带有
-O3 -march=native和gmcs的GCC 4.6.1。
标签: c# c++ visual-studio performance collections