我正在使用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);
}
当我启动仪器分析时,让我们说观察运行指令的周期数(在性能分析选项中选择),我有以下内容:
在这张图片中,我希望功能 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 功能:
也许这并不奇怪,因为这个问题与库中的排除函数有关(而不是核心源代码?)。
因此,在https://msdn.microsoft.com/en-us/library/bxwfs976(v=vs.140).aspx之后,我尝试在VS 2015中添加以下选项:
这给出了相同的结果:没有simpleReadWalk的痕迹。
此时:
/OPT:NOREF
在release
中不起作用。答案 0 :(得分:0)
你可以:
std::cout << "hello\n";
醇>
正如您提到自己的那样,停用优化(从O2到/ Od:没有优化)会对链接产生影响。