tl; dr :有人可以解释下表中显示的性能差异吗?
代码设置:有一个整数数组,在for循环中填充了值。
VS项目设置:使用两个配置文件(配置设置)。第一个是默认的发布个人资料,第二个是我们称之为 D_Release ,是发布资料的精确副本,只有一个区别; D_Release配置文件使用多线程调试DLL(/ MDd)。
我运行了两个配置文件的代码,对于每个配置文件,我将数组存储在堆,堆栈和bss中(因此有6种不同的配置)。
我测量的时间如下:
------+---------+-----------
| | /MD | /MDd |
|------+---------+-----------|
| Heap | 8,5ms | 3,5ms |
|------+---------+-----------|
| Stack| 3,5ms | 3,5ms |
|------+---------+-----------|
| bss | 10ms | 10ms |
------+---------+-----------
[开始编辑]
经过一些评论后,我在循环之前测量了工作集大小并获得了以下结果
------+---------+-----------
| | /MD | /MDd |
|------+---------+-----------|
| Heap | 2.23mb | 40.6mb |
|------+---------+-----------|
| Stack| 40.4mb | 40.6mb |
|------+---------+-----------|
| bss | 2.17mb | 2.41mb |
------+---------+-----------
[结束编辑]
当使用多线程调试DLL(/ MD)(默认版本配置文件)并将数组存储在堆中时,代码运行得慢得多,而在bss中,我在任一配置文件中的性能都会降低。
实际问题:我觉得奇怪的是调试dll运行得更快。有人可以解释性能上的差异吗?
额外信息:我尝试手动定义和取消定义_DEBUG标志,并确保差异来自使用不同的dll。我还使用了不同的计时器(例如QueryPerformanceCounter),尝试从VS和命令行运行可执行文件并尝试设置_NO_DEBUG_HEAP = 1。我还使用了对齐的malloc(_mm_malloc)来查看是否有任何改变,但它没有什么区别
有关VS运行时库的信息:http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
使用的代码
#include <iostream>
#include <chrono>
using std::cout;
using std::cerr;
using std::endl;
typedef std::chrono::high_resolution_clock hclock;
#define ALIGNMENT 32
#ifdef _MSC_VER
#define ALIGN __declspec(align(ALIGNMENT))
#else
#define ALIGN
#ifndef _mm_malloc
#define _mm_malloc(a, b) malloc(a)
#endif
#ifndef _mm_free
#define _mm_free(a) free(a)
#endif
#endif
#define HEAP 0
#define STACK 1
#define BSS 2
//SWITCH HERE
#define STORAGE 0
int main()
{
const size_t size = 10000000;
#if STORAGE == HEAP
cout << "Storing in the Heap\n";
int * a = (int*)_mm_malloc(sizeof(int)*size, ALIGNMENT);
#elif STORAGE == STACK
cout << "Storing in the Stack\n";
ALIGN int a[size];
#else
cout << "Storing in the BSS\n";
ALIGN static int a[size];
#endif
if ((int)a % ALIGNMENT)
{
cerr << "Data is not aligned" << endl;
}
//MAGIC STARTS HERE
hclock::time_point end, start = hclock::now();
for (unsigned int i = 0; i < size; ++i)
{
a[i] = i;
}
end = hclock::now();
//MAGIC ENDS HERE
cout << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << endl;
#if STORAGE == HEAP
_mm_free(a);
#endif
getchar();
return 0;
}