在Visual Studio 2013中使用Debug运行时库时,C ++代码运行得更快

时间:2014-12-22 02:34:31

标签: c++ performance visual-studio-2013

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;
}

0 个答案:

没有答案