仪器性能分析器显示主要但不是子功能?

时间:2016-02-24 13:50:31

标签: c++ performance visual-studio profiling cpu

我正在使用Visual Studio Entreprise 2015。

我想描述一个简单的程序(基本上在我的处理器上重新访问What every programmer should know about memory)。

所以我创建了下面的小程序:

#include <iostream>
#include "Header.h"
using namespace std;


void simpleReadWalk(l* start, int nb) {

    struct l* c = start;
    for (int i = 0; i < nb; i++) {
        c = c->n;
    }
}

int main() {

    int size = sizeof(struct l);
    int wsSize = 1 << 25; // working set size 2^10
    int nb = wsSize / size;

    struct l* start = new struct l;
    struct l* current = start;
    for (int i = 0; i < nb - 1; i++) {
        struct l* nextone = new struct l;
        current->n = nextone;
        current = nextone;
    }

    simpleReadWalk(start, nb);
}

当我启动仪器分析时,让我们说观察运行指令的周期数(在性能分析选项中选择),我有以下内容:

enter image description here

在这张图片中,我希望功能 simpleReadWalk ,其中我添加了一个红色问号:我想要此功能的CPU计数器值而不是整个

我必须补充一下:我勾选:&#34;添加小功能&#34;在探查器选项中(可以在下图中看到)。

我想念的是什么?

提前谢谢。

注意:为了让探查器正常工作,我必须按照here执行以下操作,不要认为这是一个问题,但谁知道,更糟糕的是,这可能会帮助其他人结束那个问题:

vsperfcmd /admin:driver,install
vsperfcmd /admin:driver,start /admin:service,start
vsperfcmd /admin:security,allow,FullAccess,<myusernamegoeshere>
vsperfcmd /admin:driver,autostart,on

===================================

编辑1:

@norisknofun发表了一个非常好的评论: simpleReadWalk 方法可能根本就没有链接。

不幸的是,在检测模式下不允许使用调试模式。 所以它归结为强制使用另一种技巧将文件包含在发行版中。

我根据force visual studio to link all symbols in a lib file

尝试使用基于双pragma指令的技巧

源代码如下:

#include <iostream>
#include "Header.h"
#include <stdio.h>

using namespace std;

/**
* Access values in a sequential fashion but using their pointer.
*/
void simpleReadWalk(l start, int nb) {
    #define FORCE_LINK_THIS(x) int force_link_##x = 0;
    struct l c = start;
    for (int i = 0; i < nb; i++) {
        c = *(c.n);
    }
}

/**
* Pack values in a array.
*/
void init(l* tab, int nb) {
    #define FORCE_LINK_THAT(x) { extern int force_link_##x; force_link_##x = 1; }
    for (int i = 0; i < nb; i++) {
        struct l nextone;
        tab[i] = nextone;
        if (i > 0) {
            tab[i - 1].n = &tab[i];
        }
    }
}

int main() {

    const int k = 25; // k like in 2^k
    const int size = sizeof(struct l);
    const int wsSize = 1 << k; // working set size 2^25
    const int nb = wsSize / size;

    struct l * tab = new struct l[nb];

    init(tab, nb);
    simpleReadWalk(tab[0], nb);

}

不幸的是,这导致了相同的结果。可以看到 init 功能,但不是 simpleReadWalk 功能:

enter image description here

也许这并不奇怪,因为这个问题与库中的排除函数有关(而不是核心源代码?)。

因此,在https://msdn.microsoft.com/en-us/library/bxwfs976(v=vs.140).aspx之后,我尝试在VS 2015中添加以下选项:

enter image description here

这给出了相同的结果:没有simpleReadWalk的痕迹。

此时:

  • 我们怀疑 - 但我们并非百分百肯定 - simpleReadWalk 未链接。我们如何确定被排除在外?
  • 如果排除 simpleReadWalk ,则不清楚为什么/OPT:NOREFrelease中不起作用。

1 个答案:

答案 0 :(得分:0)

你可以:

  1. 尝试强制所有符号的链接(即使它们没用)
  2. 在simpleReadWalk
  3. 的末尾添加一个简单的std::cout << "hello\n";

    正如您提到自己的那样,停用优化(从O2到/ Od:没有优化)会对链接产生影响。