Mah*_*dsi 6 c++ windows optimization performance kernel
我有一个程序,一次加载一个文件(从10MB到5GB)一个块(ReadFile),并为每个块执行一组数学运算(基本上计算哈希).
在计算散列之后,它将关于块的信息存储在STL映射中(基本上<chunkID, hash>),然后将块本身写入另一个文件(WriteFile).
就是这样.该程序将导致某些PC窒息死亡.鼠标开始断断续续,任务管理器需要> 2分钟显示,ctrl + alt + del无响应,运行程序很慢......工作.
我已经完成了我能想到的优化程序的所有内容,并对所有对象进行了三重检查.
我做了什么:
即使在所有这些之后,应用程序仍然会在某些情况下导致系统范围内的某些机器挂起.
Perfmon和Process Explorer显示最小的CPU使用率(使用休眠),没有来自磁盘的持续读/写,几个硬页面故障(在5GB输入文件的应用程序的生命周期中只有~30k页面故障),虚拟内存很少(从不超过150MB),没有泄漏的手柄,没有内存泄漏.
我在运行Windows XP时测试过的机器 - 包括Windows 7,x86和x64版本.没有少于2GB的RAM,尽管在较低的内存条件下问题总是会加剧.
我不知道下一步该做什么.我不知道是什么导致它 - 我在CPU或内存之间被撕裂是罪魁祸首.CPU因为没有睡眠和不同的线程优先级,系统性能会发生显着变化.内存,因为使用unordered_set与Google的dense_hash_map时,问题发生的频率存在巨大差异.
有什么奇怪的?显然,NT内核的设计应该防止这种行为的不断发生(用户模式应用驱动系统,这种极端的表现不佳!?)......但是当我编译和运行代码在OS X或Linux上(它是相当标准的C++),即使在内存较少且CPU较弱的糟糕机器上也能表现出色.
接下来我应该做什么?我怎么知道Windows在杀死系统性能的幕后所做的是什么,当所有指标都是应用程序本身没有做任何极端的事情时?
任何建议都是最受欢迎的.
事实证明,这是 Visual Studio 编译器中的一个错误。使用不同的编译器可以完全解决该问题。
就我而言,我安装并使用了英特尔 C++ 编译器,即使禁用了所有优化,我也没有看到在该库上使用 Visual Studio 2005 - 2010 编译器时遇到的整个系统挂起的情况。
我不确定是什么导致编译器生成如此损坏的代码,但看起来我们将购买英特尔编译器的副本。
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |