随机完整系统无响应运行数学函数

Mah*_*dsi 6 c++ windows optimization performance kernel

我有一个程序,一次加载一个文件(从10MB到5GB)一个块(ReadFile),并为每个块执行一组数学运算(基本上计算哈希).

在计算散列之后,它将关于块的信息存储在STL映射中(基本上<chunkID, hash>),然后将块本身写入另一个文件(WriteFile).

就是这样.该程序将导致某些PC窒息死亡.鼠标开始断断续续,任务管理器需要> 2分钟显示,ctrl + alt + del无响应,运行程序很慢......工作.

我已经完成了我能想到的优化程序的所有内容,并对所有对象进行了三重检查.

我做了什么:

  • 尝试了不同的(不太密集的)散列算法.
  • 将所有分配切换到nedmalloc而不是默认的new运算符
  • 从stl :: map切换到unordered_set,发现性能仍然很糟糕,所以我再次切换到Google的dense_hash_map.
  • 转换所有对象以存储指向对象的指针而不是对象本身.
  • 缓存所有读写操作.我没有读取16k的文件块并对其进行数学运算,而是将4MB读入缓冲区并从那里读取16k块.所有写操作都相同 - 它们在写入磁盘之前合并为4MB块.
  • 使用Visual Studio 2010,AMD Code Analyst和perfmon进行大量分析.
  • 将线程优先级设置为THREAD_MODE_BACKGROUND_BEGIN
  • 将线程优先级设置为THREAD_PRIORITY_IDLE
  • 每次循环后添加Sleep(100)调用.

即使在所有这些之后,应用程序仍然会在某些情况下导致系统范围内的某些机器挂起.

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在杀死系统性能的幕后所做的是什么,当所有指标都是应用程序本身没有做任何极端的事情时?

任何建议都是最受欢迎的.

Mah*_*dsi 1

事实证明,这是 Visual Studio 编译器中的一个错误。使用不同的编译器可以完全解决该问题。

就我而言,我安装并使用了英特尔 C++ 编译器,即使禁用了所有优化,我也没有看到在该库上使用 Visual Studio 2005 - 2010 编译器时遇到的整个系统挂起的情况。

我不确定是什么导致编译器生成如此损坏的代码,但看起来我们将购买英特尔编译器的副本。